[iOS][WebView] Gesture recognizers not blocked in iOS 13.4 and 13.5

After having installed Mac OS Catalina 10.15.4, Xcode 11.4 and iOS13.4, my Flutter Application running on iOS (simulator and actual device [iPhoneX]) is very buggy !
Before, I had a floatingActionButton working fine. And also Drawer (left and right) where working fine.
Underneath the FloatingActionButton and Drawers is a WebView.
But after the Mac SW update:

floatingActionButton makes a screen-freeze
Drawer shows but freezes when trying to close it

I tried the following two configs:
1.) Flutter STABLE 1.12.13+hotfix.8,  plus the Xcode-11.4 workaround described here...
2.) Flutter BETA 1.15.17
But, again, for both configs same error behaviour under iOS - screen-freezes without error-message.
On Android, everything works fine.
What is wrong under iOS?
Here excerpts of the pubspec.yaml :
environment:
  sdk: ">=2.1.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  webview_flutter: ^0.3.19+9
  cloud_firestore: ^0.13.4+1
  firebase_core: ^0.4.4+2
  firebase_auth: 0.15.3
  provider: ^4.0.4
  flutter_spinkit: ^4.1.2
  device_info: ^0.4.2+1
  page_transition: ^1.1.5
  package_info: ^0.4.0+16
  crypto: ^2.1.3
  shared_preferences: ^0.5.6+3
  url_launcher: ^5.4.2
  flutter_background_geolocation: ^1.7.1

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2

dependency_overrides:
  firebase_core: 0.4.4

dev_dependencies:
  flutter_test:
    sdk: flutter

Here is my flutter doctor -v :
[✓] Flutter (Channel beta, v1.15.17, on Mac OS X 10.15.4 19E266, locale en-CH)
    • Flutter version 1.15.17 at /Users/myName/Documents/flutter
    • Framework revision 2294d75bfa (3 weeks ago), 2020-03-07 00:28:38 +0900
    • Engine revision 5aff311948
    • Dart version 2.8.0 (build 2.8.0-dev.12.0 9983424a3c)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    • Android SDK at /Users/myName/Library/Android/sdk
    • Android NDK location not configured (optional; useful for native profiling support)
    • Platform android-29, build-tools 29.0.2
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 11.4)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.4, Build version 11E146
    • CocoaPods version 1.8.4

[✓] Android Studio (version 3.6)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 44.0.2
    • Dart plugin version 192.7761
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)

[✓] VS Code (version 1.43.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.8.1

[✓] Connected device (2 available)
    • Android SDK built for x86 • emulator-5554                            • android-x86 • Android 10 (API 29) (emulator)
    • MyPhone                     • d709a13432kjie7429258466dbas3f29r45gdl8s • ios         • iOS 13.4

• No issues found!

edited by cyanglaz
Internal: b/155322611

Hi @iKK001
Can you post complete minimal code sample to reproduce your case?
With this simplest code I don't experience any freezes.
Tried with beta 1.15.17 and iPhone 7 iOS 13.4 after MacOS and Xcode update

code
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  final appTitle = 'Drawer Demo';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: appTitle,
      home: MyHomePage(title: appTitle),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;

  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(title)),
      body: WebView(
        initialUrl: 'https://flutter.dev/',
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          print('pressed');
        },
        child: Icon(Icons.navigation),
        backgroundColor: Colors.green,
      ),
      drawer: Drawer(
        child: ListView(
          padding: EdgeInsets.zero,
          children: <Widget>[
            DrawerHeader(
              child: Text('Drawer Header'),
              decoration: BoxDecoration(
                color: Colors.blue,
              ),
            ),
            ListTile(
              title: Text('Item 1'),
              onTap: () {
                Navigator.pop(context);
              },
            ),
            ListTile(
              title: Text('Item 2'),
              onTap: () {
                Navigator.pop(context);
              },
            ),
          ],
        ),
      ),
    );
  }
}

https://github.com/flutter/flutter/issues/53510, https://github.com/flutter/flutter/issues/53511

Hi Vladyslav, here is my code (i.e. most of it to get the idea):
import 'dart:async';
import 'package:myapp_test/app_locations.dart';
import 'package:myapp_test/drawers/drawer_left.dart';
import 'package:myapp_test/drawers/drawer_right.dart';
import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:myapp_test/shared/constants.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:myapp_test/screens/user_state.dart';

final webViewKey = GlobalKey<_WebViewContainerState>();

class MyWebView extends StatefulWidget {
  @override
  _MyWebViewState createState() => _MyWebViewState();
}

class _MyWebViewState extends State<MyWebView> {
  String currentPage = 'page001';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: Builder(
          builder: (context) => IconButton(
              icon: Icon(Icons.menu), // Icon(Icons.more_vert),
              onPressed: () {
                Scaffold.of(context).openDrawer();
              }),
        ),
        title: const Text(
          'My App',
          style: TextStyle(fontSize: 23.0),
        ),
        // This drop down menu demonstrates that Flutter widgets can be shown over the web view.
        actions: <Widget>[
          // IconButton(icon: Icon(Icons.search), onPressed: () async { },),
          Builder(
            builder: (context) => GestureDetector(
              onTap: () {
                Scaffold.of(context).openEndDrawer();
              },
              child: Container(
                width: 60.0,
                height: 44.0,
                child: Center(
                  child: Image.asset(
                    'assets/icons/page.png',
                    fit: BoxFit.fill,
                    height: 34.0,
                    width: 34.0,
                  ),
                ),
              ),
            ),
          ),
        ],
      ),
      drawer: SafeArea(
        child: Transform.translate(
          offset: Offset(0.0, -50.0),
          child: ClipRRect(
            borderRadius: BorderRadius.only(
              topLeft: Radius.circular(0.0),
              topRight: Radius.circular(14.0),
              bottomLeft: Radius.circular(0.0),
              bottomRight: Radius.circular(14.0),
            ),
            child: Container(
              height: 620.0,
              child: Drawer(
                elevation: 4.0,
                child: DrawerLeft(),
              ),
            ),
          ),
        ),
      ),
      endDrawer: SafeArea(
        child: Transform.translate(
          offset: Offset(0.0, -50.0),
          child: ClipRRect(
            borderRadius: BorderRadius.only(
              topLeft: Radius.circular(14.0),
              topRight: Radius.circular(0.0),
              bottomLeft: Radius.circular(14.0),
              bottomRight: Radius.circular(0.0),
            ),
            child: Container(
              height: 620.0,
              child: Drawer(
                elevation: 4.0,
                child: DrawerRight(
                  callback: (pageType) {
                    setState(() {
                      currentPage = pageType;
                      // using currentState with question mark to ensure it's not null
                      webViewKey.currentState?.reloadWebView(pageType);
                    });
                  },
                ),
              ),
            ),
          ),
        ),
      ),
      body: WebViewContainer(key: webViewKey),
      floatingActionButton: favoriteButton(webViewKey),
    );
  }

  Widget favoriteButton(GlobalKey<_WebViewContainerState> webViewKey) {
    return Container(
      width: 500.0,
      height: 80.0,
      child: Stack(
        children: <Widget>[
          Positioned(
            bottom: 10.0,
            left: 30.0,
            child: ButtonTheme(
              shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(15.0)),
              height: 60.0,
              minWidth: 345.0,
              child: RaisedButton(
                child: Text(
                  AppLocalizations.of(context)
                      .translate('    My Personal Situation'),
                  style: TextStyle(
                      fontSize: 20.0,
                      color: Colors.white,
                      fontWeight: FontWeight.w600),
                ),
                color: Colors.blue,
                onPressed: () async {
                  return await Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => UserState()),
                  ).then((value) {
                    setState(() {
                      webViewKey.currentState?.reloadWebView(currentPage);
                    });
                  });
                },
              ),
            ),
          ),
          Positioned(
            bottom: 18.0,
            left: 40.0,
            child: ClipRRect(
              borderRadius: BorderRadius.circular(8.0),
              child: Image.asset(
                'assets/icons/icon.png',
                fit: BoxFit.cover,
                height: 42.0,
              ),
            ),
          ),
        ],
      ),
    );
  }
}

class WebViewContainer extends StatefulWidget {
  WebViewContainer({Key key}) : super(key: key);

  @override
  _WebViewContainerState createState() => _WebViewContainerState();
}

class _WebViewContainerState extends State<WebViewContainer> {
  final Completer<WebViewController> _webViewController =
      Completer<WebViewController>();
  String myWebSide = '';

  String _getPage_001(
      String pageName, String lat, String lng, String zoom) {
    return '''
    <!DOCTYPE html>

        <meta name="viewport" content="width=device-width, initial-scale=1.0">

    ''';
  }

  @override
  Widget build(BuildContext context) {

    return Builder(builder: (BuildContext context) {
      String contentBase64 =
          base64Encode(const Utf8Encoder().convert(myWebSide));
      return WebView(
        initialUrl: 'data:text/html;base64,$contentBase64',
        javascriptMode: JavascriptMode.unrestricted,
        onWebViewCreated: (WebViewController webViewController) {
          _webViewController.complete(webViewController);
        },
        javascriptChannels: <JavascriptChannel>[
          _toasterJavascriptChannel(context),
        ].toSet(),
        navigationDelegate: (NavigationRequest request) {
          if (request.url.startsWith('https://www.youtube.com/')) {
            // print('blocking navigation to $request}');
            return NavigationDecision.prevent;
          }
          // print('allowing navigation to $request');
          return NavigationDecision.navigate;
        },
        onPageStarted: (String url) {
          // print('Page started loading: $url');
        },
        onPageFinished: (String url) {
          // print('Page finished loading: $url');
        },
        gestureNavigationEnabled: true,
      );
    });
  }

  void reloadWebView(String pageType) async {
    if (pageType == 'page001') {
      String pageName = 'Page001.png';
      String lat = '46.696605';
      String lng = '8.294296';
      String zoom = '7';
      myWebSide = _getPage_001(pageName, lat, lng, zoom);
    }
    // reload new webview
    setState(() {
      String contentBase64 =
          base64Encode(const Utf8Encoder().convert(myWebSide));
      _webViewController.future.then((value) => value.loadUrl('data:text/html;base64,$contentBase64'));
    });
  }
}

@iKK001
could you record your screen to show how does it look?

Below you find a video that illustrates the error behaviour:

All gestures and touch-event are "transparent" and make the webview underneath move instead.
All navigation events are ignored
The only working-area is the NavBar (i.e. where there is no webView)
If I replace the webview by a simple Text('hello') Widget instead, then everything works again...
(problem only for iOS)

webview_error.mp4.zip

Any new information on this issue？

Same problem here. On our WebView App there is a map and when selecting a point of interest, then close it, the WebView is freezed. The back button in the navigation bar is still working.

Vaclav, do you have any comment on this, please ?  Is it a Flutter issue or not ?

@iKK001
sorry, I don't have comments about this. But I just realised that it is like this when using google map in WebView. Reproduces with dev v1.16.4-pre.33 as well

code
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  final appTitle = 'Drawer Demo';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: appTitle,
      home: MyHomePage(title: appTitle),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;

  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(title)),
      body: WebView(
        initialUrl: 'https://www.google.ee/maps',
        javascriptMode: JavascriptMode.unrestricted,
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          print('pressed');
        },
        child: Icon(Icons.navigation),
        backgroundColor: Colors.green,
      ),
      drawer: Drawer(
        child: ListView(
          padding: EdgeInsets.zero,
          children: <Widget>[
            DrawerHeader(
              child: Text('Drawer Header'),
              decoration: BoxDecoration(
                color: Colors.blue,
              ),
            ),
            ListTile(
              title: Text('Item 1'),
              onTap: () {
                Navigator.pop(context);
              },
            ),
            ListTile(
              title: Text('Item 2'),
              onTap: () {
                Navigator.pop(context);
              },
            ),
          ],
        ),
      ),
    );
  }
}

without using floatingActionButton, open drawer, now map responds to gestures instead of drawer's items.
drag map, press floatingActionButton. After this map doesn't respond to gestures, but drawer's items do.

Screen recording

@VladyslavBondarenko The error also occurs with HereMaps. We use HereMaps on the page that is integrated in the WebView.
The error occurs on this page when it is integrated in a WebView: https://www.camping.info/en/search-on-map?area=-21.240625,61.111082,42.040624,38.358364&zl=5

@VladyslavBondarenko This issue is also occurs with my inline web page(using webview_flutter), I think title is not correct now.

I’m not sure what severity label is better to use here, please consider to change it

@VladyslavBondarenko plugin issues usually doesn't block dev rolls, I'm going to lower the severity.

@VladyslavBondarenko following on @cyanglaz, this is because plugins are published and versioned independently from the framework (though they are often dependent on framework versions/features).  So a plugin bug will rarely cause us to stop publishing framework releases (unless the bug is affecting a plugin but actually lies in the framework).

To summarize my discovery:
Confirmed that it only started to happen on iOS 13.4, and it only affects certain web pages. ("google map" webpage has the issue, but "youtube" works fine)
There are 2 issues here:

The gesture is recognized by the webview behind the flutter button.
The framework successfully recognized the gesture tapped on the button, and tries to block the webview to receive the guesture. However, the webview continues to receive the gesture. Which is similar to https://github.com/flutter/flutter/issues/50420; And it is probably due to some changes in the WKWebView that they started to override UIGestureRecognizer methods like touchesBegin: to handle gestures. We have a known issue that our gesture block implementation on iOS doesn't work if the platform view implements "onTouchesBegan" and "onTouchesEnded" to handle gestures, rather than use the standard addTarget:action: method.
Our ForwardingGestureRecognizer didn't receive touchesEnded: callback. Then flutter framework didn't receive the touches up event, resulting the onTap not getting called.

Both issues are newly introduced in iOS 13.4, and I suspect both are due to some changes in WKWebView.
Will give further update in this thread if when I have any progress.

cc @amirh

I am also experiencing this as of updating to Catalina/Xcode 11.4 tonight.

@cyanglaz is there any progress，please？We are also waiting for the solution to this problem

Same issue here, using a WebView with a 360° panorama viewer.
Issue appeared on iOS 13.4, works fine on Android.

https://stackoverflow.com/questions/61208881/cant-handle-touches-simultaneously-with-wkwebview-on-ios-13-4
seems related. It seems like WKWebView starts to block other gesture recognizers that are added to the view.
We use DelayingGestureRecognizer and ForwardingGestureRecognizer on the WKWebview to handle gestures in flutter, and both of them are blocked by WKWebView. This caused discrepancy in the gesture handling in Flutter.

@VladyslavBondarenko The error also occurs with HereMaps. We use HereMaps on the page that is integrated in the WebView.
The error occurs on this page when it is integrated in a WebView on iOS 13.4: https://www.camping.info/en/search-on-map

We have now switched to the Community Plugin for WebViews because the map works there. This is maybe an alternative or an interim solution for some.

We have now switched to the Community Plugin for WebViews because the map works there. This is maybe an alternative or an interim solution for some.

A workaround to this issue is to remove all Flutter Widgets that are shown above the WebView, which is very inconvenient.
But your suggestion to use the Community plugin is the same no ?
From the main page of the latter :
Warning: The webview is not integrated in the widget tree, it is a native view on top of the flutter view. You won't be able see snackbars, dialogs, or other flutter widgets that would overlap with the region of the screen taken up by the webview.

For our purpose it's an alternative, because we're using currently just a pure WebView app without any overlay widgets. So the app can at least be used again under iOS 13.4.

For our purpose it's an alternative, because we're using currently just a pure WebView app without any overlay widgets. So the app can at least be used again under iOS 13.4.

So you have this issue even without Flutter Widgets above the WebView ?

So you have this issue even without Flutter Widgets above the WebView ?

Yes, like I said above we've got an app with only a WebView. It's possible to reproduce the freezing of the WebView in the AppStore app or just using a WebView with this url (https://www.camping.info/en/search-on-map). Then the following must be done:

Same problem here. On our WebView App there is a map and when selecting a point of interest, then close it (go back to the map), the WebView is freezed. The back button in the navigation bar is still working.

@DFelten Your issue might be a little different. If you could open a new issue with reproduction details and reduced test case, we can surely take a look!

any updates?

Any workaround so far?
The issue seems to persist in the iOS 13.4.5beta. Isn't a stable webview gesture support a major issue for many developers? Maybe someone can share his or her approach to deal with the problem.

Hi @iKK001
are you still experiencing the issue with the latest master?
sample
thank you

Sorry, I could not test (since very busy right now). I quick-tried to let my project run under master (1.18.0-11.0.pre.6 • channel master • - but unfortunately, a new problem occurred The method 'RadioSliderThumbShape.paint' has fewer named arguments than those of overridden method 'SliderComponentShape.paint' - and I really do not have time to investigate this right now. As long as Flutter changes versions with breaking changes, it is not useful for a production App.

@cyanglaz I'm facing a slightly different issue than this one, but I believe the cause is the same.
When this happens, the value of DelayingGestureRecognizer.state seems to be unchanged.
The following is my guess. I'm sorry if I'm wrong. 🙇
I'm curious about this code.
If shouldEndInNextTouchesEnded is set to YES, then state is set to UIGEstureRecognizerStateEnded.
But it is only when touchesEnded is fired. No action is taken when touchesCancelled is fired.
If touchesCancelled is fired, is state set to UIGeStureRecognizerStateFailed ?

I conducted the following experiment.

I got the DelayingGestureRecognizer and ForwardingGestureRecognizer from the UIView#gestureRecognizers and monitored the values.
I noticed that ForwardingGestureRecognizer.state sometimes remains possible even if DelayingGestureRecognizer.state becomes failed.
Then I set failed to ForwardingGestureRecognizer.state, and the bug was resolved.

@macoshita Nice! Could you explain more? Or if you'd like to start a PR I'd be happy to take a look!

@macoshita thank you for your debug ! Could you explain more about your solution ?
I have a production app that with this issue is almost unusable.

One moment, please. I'll make a small reproduction example!

My experimental code
This is a webview_flutter example with a "Fix Freeze" button.
If webview no longer responds to gesture, pressing this button will make it respond again.
If you press this button when webview is unresponsive, debug console will be shown as recognizer delay_state: 5, forward_state: 0.
Whenever this problem occurs, UIGestureRecognizer.state is different from ForwardingGestureRecognizer and DelayingGestureRecognizer.
In most cases, "Delaying..." is 5(meaning: failed) and "Forwarding..." is 0(meaning: possible). In rare cases, "Delaying..." is 3(meaning: ended).
If observing this state and make it automatically rewrite the state, this problem should be fixed.
However, this is not a radical solution at all.
Please see also this reproduction video (iPhone 8 Plus)↓

Touch the map.
Open the drawer.
Webview becomes unresponsive.
Reloading does not fix it.
Pressing the "Fix Freeze" button fixes it.

At the end: my English isn't very good, so it's hard to understand. I'm sorry. 😅

P.S.
I've seen the same problem happen with just repeated swipes at https://kenwheeler.github.io/slick/.
Also, I have a self-built carousel library (sorry I can't publish it), and it still has the same problem.

@macoshita Did you mean that you still have the issue even applying the fix you provided above?

I encountered the same or similar problem with mapbox-gl-js in WebView. The map gets stuck after a short while I operating (zoom in or zoom out, move the camera) the map.
I have created a demo app so you can reproduce the issue.
The demo just works when I switch to flutter_webview_plugin
diff --git a/lib/screens/map/simple-map-view.dart b/lib/screens/map/simple-map-view.dart
index 6f68aa1..5512b5d 100644
--- a/lib/screens/map/simple-map-view.dart
+++ b/lib/screens/map/simple-map-view.dart
@@ -1,12 +1,14 @@
 import 'package:flutter/material.dart';
-import 'package:webview_flutter/webview_flutter.dart';
+import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';

 class SimpleMapViewWidget extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
-    return WebView(
-      initialUrl: "http://<IP_ADDRESS>:8080/mapbox-gl-demo/index.html",
-      javascriptMode: JavascriptMode.unrestricted,
-    );
+    return WebviewScaffold(url: "http://<IP_ADDRESS>:8080/mapbox-gl-demo/index.html");
   }
 }
\ No newline at end of file

Flutter 1.17.2 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 5f21edf8b6 (12 hours ago) • 2020-05-28 12:44:12 -0700
Engine • revision b851c71829
Tools • Dart 2.8.3
iOS: 13.5

any updates?

@cyanglaz

If observing this state and make it automatically rewrite the state, this problem should be fixed.
I've released the app fixed this way. So far no problems have occurred.

However, this is a workaround.
It would be best if the state of ForwardingGestureRecognizer works as expected.

@macoshita Thanks for providing the workaround. I have filed a bug/feature request to Apple and see if the WKWebView can be fixed. Otherwise, if the workaround works, it might be our best short term solution. Do you mind to open a PR with the workaround? I'm happy to take a look!

I encountered the same or similar problem with mapbox-gl-js in WebView. The map gets stuck after a short while I operating (zoom in or zoom out, move the camera) the map.
I have created a demo app so you can reproduce the issue.
The demo just works when I switch to flutter_webview_plugin
diff --git a/lib/screens/map/simple-map-view.dart b/lib/screens/map/simple-map-view.dart
index 6f68aa1..5512b5d 100644
--- a/lib/screens/map/simple-map-view.dart
+++ b/lib/screens/map/simple-map-view.dart
@@ -1,12 +1,14 @@
 import 'package:flutter/material.dart';
-import 'package:webview_flutter/webview_flutter.dart';
+import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';

 class SimpleMapViewWidget extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
-    return WebView(
-      initialUrl: "http://<IP_ADDRESS>:8080/mapbox-gl-demo/index.html",
-      javascriptMode: JavascriptMode.unrestricted,
-    );
+    return WebviewScaffold(url: "http://<IP_ADDRESS>:8080/mapbox-gl-demo/index.html");
   }
 }
\ No newline at end of file

Flutter 1.17.2 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 5f21edf (12 hours ago) • 2020-05-28 12:44:12 -0700
Engine • revision b851c71829
Tools • Dart 2.8.3
iOS: 13.5

I can confirm that using the flutter_webview_plugin resolved my issue. This will likely be my temporary workaround for now. Hopefully that helps someone!
My issue with webview_flutter came from updating my phone to iOS 13.5... initially it was on iOS 12 but the old library seems to work fine.

Applying the workaround from @macoshita is causing a full webview refresh.
flutter_webview_plugin doesn't work for us as we have widgets and alerts over the webview.
Unfortunately this is impacting our iOS users in production. Any tips highly appreciated.

@macoshita Thanks for providing the workaround. I have filed a bug/feature request to Apple and see if the WKWebView can be fixed. Otherwise, if the workaround works, it might be our best short term solution. Do you mind to open a PR with the workaround? I'm happy to take a look!

@cyanglaz Please have news of the bug report? Is it possible to have a link to track the request you made to Apple? With @andrearubeis we have an app in production and we would like to understand if Apple will be able to solve the problem in an upcoming iOS release.

@paolon The bug was filed using Apple's Radar system and can be only accessed using the account that filed the bug .

I'm found this bug in iOS13.4-13.5, in iOS 13.3 is work fine.in Android is work fine.
I‘m open same URL by iOS safari  in iOS13.4-13.5 work fine.
I'm use [flutter_webview_plugin] in iOS13.4-13.5 work fine. but this plugin is not in widget tree, so i can't use it.
BTW, my flutter version is 1.17.0.
Sorry, my english is not good, hope can understand.

As a matter of fact, I don't use the webview_flutter plugin.
I use a plugin I created for a specific requirement.
Also, no Refresh Issue is happening in that plugin.
I'm too busy to find out what causes the refresh and create a pull request. Sorry. 🙇

After all this time, is there a solution?

Even we are stuck on the same issue. Any progress?

We are stuck on the same issue too. Any progress?

Same issue here, any solution?

I have the same issue, but I only have it when I have WebView inside on SingleChildScrollView.

I have the same issue on iOS above 13.4.
The app just works when I switch to flutter_webview_plugin on iOS 13.5.1, which can't set useragent on iOS and display white in some areas after loading on android 10 .
According to the document,on iOS the WebView widget is backed by a WKWebView,but WKWebView should work properly on iOS.

The WKDeferringGestureRecognizer(Webkit Internal API) in the WKWebView seems to be the one that is blocking the ForwardingGestureRecognizer in the flutter engine.
https://github.com/WebKit/webkit/blame/master/Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.mm
This is a new gesture recognizer that was added about 7 months ago.

Also, https://github.com/flutter/flutter/issues/30143 might be related

Updates:
The WKDeferringGestureRecognizer(Webkit Internal API) in the WKWebView seems to be the one that is blocking the ForwardingGestureRecognizer in the flutter engine.
https://github.com/WebKit/webkit/blame/master/Source/WebKit/UIProcess/ios/WKDeferringGestureRecognizer.mm
This is a new gesture recognizer that was added about 7 months ago.

Sorry for this question, but how this issue can be fixed? THANK YOU!!!!

@evdinursan There are 2 separate issues here:
The issue about WKDeferrtingGestureRecognizer blocking the ForwardingGestureRecognizer issue can be fixed from flutter engine, which I plan to fix soon.
Another issue is that touchStart event is not blocked by flutter widget (#30143). I'm still trying to find solutions for this issue.

@evdinursan There are 2 separate issues here:
The issue about WKDeferrtingGestureRecognizer blocking the ForwardingGestureRecognizer issue can be fixed from flutter engine, which I plan to fix soon.
Another issue is that touchStart event is not blocked by flutter widget (#30143). I'm still trying to find solutions for this issue.

I have an application that should go live pretty soon and because of this issue, we will postpone the iOS deployment, so if you need any kind of debugging data, please let ne know.
Thanks

@evdinursan There are 2 separate issues here:
The issue about WKDeferrtingGestureRecognizer blocking the ForwardingGestureRecognizer issue can be fixed from flutter engine, which I plan to fix soon.
Another issue is that touchStart event is not blocked by flutter widget (#30143). I'm still trying to find solutions for this issue.

@evdinursan There are 2 separate issues here:
The issue about WKDeferrtingGestureRecognizer blocking the ForwardingGestureRecognizer issue can be fixed from flutter engine, which I plan to fix soon.
Another issue is that touchStart event is not blocked by flutter widget (#30143). I'm still trying to find solutions for this issue.

I have an application that should go live pretty soon and because of this issue, we will postpone the iOS deployment, so if you need any kind of debugging data, please let ne know.
Thanks

I stuck the same situation with you!

Hi everyone! Wanted to let you know that this morning I updated my Xcode to 15.6 and now the issue is gone. If you deploy it on a phisical device (ios) you should be aware that you also should update the iPhone to 13.6 in order to see the fix.

Hi everyone! Wanted to let you know that this morning I updated my Xcode to 15.6 and now the issue is gone. If you deploy it on a phisical device (ios) you should be aware that you also should update the iPhone to 13.6 in order to see the fix.
Still, if you find a fix for the older version, that would be great.

Just tested my app without any changes after updating my iPad to 13.6 and can confirm is working now!! Awesome. Thanks @evdinursan for the good news!

İ have same issue. Are there any solution except ios 13.6 upgrade ?

is there any fix for ios version  under  13.6 ?

I have this problem is ios version 13.6 either.
Is there any update?

Other webview packages  also not working on ios. We had to delay the ios deployment because of this.
webview_flutter not updated since May 21.  Do you have a road map for this bug? Thanks. Best regards.

The bug seems to be solved with the latest public beta (7).

The bug seems to be solved with the latest iOS 14 public beta (7).

this issue still continue in ios 13.5 and 13.4. webview_flutter not updated since May 21.

I am having this issue after update to 1.20.
It isn't affected by aniOS version because the old one that I published to market works fine. Maybe this is a new issue.

I updated my Xcode to 11.7 and iOS 13.7 the issue still appears.
I have no idea what to do with this bug.

@njovy were you seeing the issue fixed in 13.6 but happened again in 13.7?

@cyanglaz Thank you very much for your attention. The webview gesture issue that I found isn't related to a specific iOS version. It's related to flutter SDK versions. The issue I found happens on iOS 13.5, iOS 13.6, 13.7, iOS 11.4.1 so I don't think this issue is iOS version specific.
I also found what version causes this as well. I tested my app with 1.19.0-4.3.pre, 1.20.0, 1.20.1, 1.20.2, 1.20.3, and 1.21.0-9.2.pre. Starting from 1.20.2, my app no longer works as expected. When I launch a screen that has an WebView, I can't touch or scroll inside WebView. Plus, when I swipe right to go back to screen, the screen got stuck and freezes in the middle of swiping.

@cyanglaz One thing I noticed is that if I display the problematic WebView screen as an initial screen, it works as expected. It scrolls. The webview screen is an agreement screen showing a privacy and terms, etc so it doesn't make sense to put it as a home screen. I am not sure which patch made this change starting from 1.20.2.

@cyanglaz Above is a screen recording of this issue.
When the last screen is displayed, I tried to scroll but it didn't scroll inside an WebView. When I swipe right to go back, it stuck and the app freezes, I can't touch anything. Images still animating so I wouldn't say the app freezes but every gesture event doesn't work.

@njovy I think you have encountered a different issue. Also this issue should be fixed by https://github.com/flutter/engine/pull/20708
If you try flutter on master channel, it should be fixed.
The fix should also be cherry-picked and you can expect the fix in flutter 1.20.3

@cyanglaz No it's not fixed in 1.20.3. That's why I thought this could be a new issue. I already tried 1.20.3, and 1.21.0-9.2.pre. Both sdk versions have this https://github.com/flutter/engine/pull/20708 fix but the issue still appears.

https://gist.github.com/Voxar/5dbef0b76cc8cb55d2fe74a492d41c54#file-add-a-guardian-for-flutters-touch-interceptor-state-patch that can help. but it does not offer a complete solution. I'm showing a webview and a vis.js timeline in a tabpage. I show loadingindicator by putting webview into stack and I support right-left swipe to switch tabpage. The page only works if there is a webview, but when you use the gesture event from within another widget, the webview freezes. Bug still continue after ios 13.4

@cyanglaz Any comments regarding this issue? I can create a new issue if this bug is not related to this.

@njovy looks like what you are experiencing is not related to this issue. If you could create a new bug with details explaining the issue, that'd be great!

I have similar issue. context Manu is shown even I click flutter button

I have similar issue. context Manu is shown even I click flutter button

Don't put the flutter button on the map. For example, you can put the map and button in the column. Then you will see that there is no freeze. However, if there are multiple gesture events in the same area, webview also freezes. And this is happening in all ios versions above 13.0.

@ztigunes have you tried iOS 13.6 and above?

I have tried also 13.7

If we add a webview as a tabview only and swipe left and right in tabs, both the webview freezes and the swipe between tabpages is broken. (use two finger for swipe and try multi touch)  All tabviews freeze. This situation is still happening on ios 13.6 and above.  if you give a webview as TabBarView with initial url 'https://www.google.com/maps' at 'https://flutter.dev/docs/cookbook/design/tabs' this sample, you can see all freeze.

@ztigunes What you described could be a different issue. I will give it a try and get back to you.

@cyanglaz https://github.com/flutter/engine/pull/20050 This is the only patch that can cause this issue because my webview has been working fine until 1.20.1.

@njovy Interesting. It looks like a different issue. Could you please open a new github issue with details(flutter version, reproduction steps, sample code), and tag me there?

@cyanglaz https://github.com/flutter/flutter/issues/66044 is the new issue I just opened. As I stated there, I could not find a way to reproduce this issue at the moment. If I find a way, I will add there.

@ztigunes What you described could be a different issue. I will give it a try and get back to you.

@cyanglaz, is the #66044 issue related to this?

@ztigunes The issue you are facing might be related to #66044, this particular issue is related to WKWebView on iOS 13.4 and 13.5

this is happening for me as well using flutter 1.20.4 passing a gestureRecognizer to a UIKitView widget
I use the same gesture recognizer for Android and iOS, but it freezes the screen on iOS and works fine on Android, this just started happening in Flutter 1.20.1
SizedBox(
width: double.infinity,
height: 130,
child: (Platform.isIOS)
? UiKitView(
gestureRecognizers:
<Factory>[
Factory(
() => PlatformViewHorizontalGestureRecognizer(),
),
].toSet(),
viewType: 'Goals',
)
: AndroidView(
gestureRecognizers:
<Factory>[
Factory(
() => PlatformViewHorizontalGestureRecognizer(),
),
].toSet(),
viewType: 'Goals',
),
)),

The issue is due to the WKWebView aggressively blocking the delaying gesture recognizer to block gesture recognizers on the WKWebView on iOS 13.4 and 13.5
Unfortunately, after spending major time looking into this bug, I think this is unfixable under the current platform view architecture. The only way that I think we can fix it is to merge the UIThread and PlatformThread in flutter engine to make synchronized gesture blocking. The con of such a fix out weights the pro, especially the issue only occurs in some old iOS versions.
I'm going to close this issue because we don't have a plan to fix it for iOS 13.4 and 13.5.

We should also update the documentation of the webview plugin to indicate this limitation of the plugin on iOS 13.4 and 13.5. I opened a new issue to track this limitation. https://github.com/flutter/flutter/issues/67541

@cyanglaz Do we have proof that this is fixed in later iOS versions like 14.1 and 2? customer:money observed a suspiciously similar problem on iOS 14.2.

@cyanglaz Do we have proof that this is fixed in later iOS versions like 14.1 and 2? customer:money observed a suspiciously similar problem on iOS 14.2.

With the repro steps in https://github.com/flutter/flutter/issues/50420, I indeed do not see this problem on iOS 14.3; I asked customer:money to come up with a reproducible use case.

With the repro steps in https://github.com/flutter/flutter/issues/50420, I indeed do not see this problem on iOS 14.3; I asked customer:money to come up with a reproducible use case.

Tested on a real iPhone 12 Pro and this issue persists on iOS 14.4, using webview_flutter: ^2.0.0-nullsafety.5.
After some hard debugging, I found that the problem is somehow related to javascript touch (or whatever) events added to HTML elements.
If you set javascriptMode: JavascriptMode.disabled (which is the default value), flutter widgets, such as buttons, that are over the Flutter WebView widget seem to work as expected, and the touch gestures are not propagated to the WebView (WKWebView) under this buttons.

CODE EXAMPLE with JavascriptMode.disabled
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() {
runApp(MyApp());
}

class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
@override
void initState() {
  super.initState();
}

@override
Widget build(BuildContext context) {
  return MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: const Text('Example app'),
      ),
      body: Stack(
        children: [
          WebView(
            initialUrl: "https://www.google.com",
            javascriptMode: JavascriptMode.disabled,
          ),
          Container(
            child: Column(
                mainAxisSize: MainAxisSize.min,
                mainAxisAlignment: MainAxisAlignment.end,
                children: [
                  ElevatedButton(onPressed: () {
                    print("button 1");
                  }, child: Text("TEST TEST TEST TEST TEST TEST")),
                  ElevatedButton(onPressed: () {
                    print("button 2");
                  }, child: Text("test")),
                  ElevatedButton(onPressed: () {
                    print("button 3");
                  }, child: Text("test")),
                  ElevatedButton(onPressed: () {
                    print("button 4");
                  }, child: Text("test")),
                  ElevatedButton(onPressed: () {
                    print("button 5");
                  }, child: Text("test")),
                  ElevatedButton(onPressed: () {
                    print("button 6");
                  }, child: Text("test")),
                ]),
          ),

        ],
      ),
    ),
  );
}
}

https://user-images.githubusercontent.com/5956938/108504848-d8180800-72b6-11eb-8f90-319216893e8b.mov
Instead, if you set javascriptMode: JavascriptMode.unrestricted, (which is the value used, probably, most of the times), flutter buttons touch gestures are propagated to the Flutter WebView widget, but only on HTML elements that listen to javascript touch events (for example: addEventListener on touchstart, click, etc.).
So, If you tap on a Flutter Button that is over an HTML element that doesn't listen to any javascript touch events, the tap event doesn't propagate to the Flutter WebView.
Also, I noticed that the propagation is not instant, but only if you tap or long-press two times in the same area of the Flutter WebView:

the first time, you tap or long-press on a flutter button that is over an HTML element with the javascript event listener
the second time, you can tap or long-press everywhere in the same area.

CODE EXAMPLE with JavascriptMode.unrestricted
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() {
runApp(MyApp());
}

class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
@override
void initState() {
  super.initState();
}

@override
Widget build(BuildContext context) {
  return MaterialApp(
    home: Scaffold(
      appBar: AppBar(
        title: const Text('Example app'),
      ),
      body: Stack(
        children: [
          WebView(
            initialUrl: "https://www.google.com",
            javascriptMode: JavascriptMode.unrestricted,
          ),
          Container(
            child: Column(
                mainAxisSize: MainAxisSize.min,
                mainAxisAlignment: MainAxisAlignment.end,
                children: [
                  ElevatedButton(onPressed: () {
                    print("button 1");
                  }, child: Text("TEST TEST TEST TEST TEST TEST")),
                  ElevatedButton(onPressed: () {
                    print("button 2");
                  }, child: Text("test")),
                  ElevatedButton(onPressed: () {
                    print("button 3");
                  }, child: Text("test")),
                  ElevatedButton(onPressed: () {
                    print("button 4");
                  }, child: Text("test")),
                  ElevatedButton(onPressed: () {
                    print("button 5");
                  }, child: Text("test")),
                  ElevatedButton(onPressed: () {
                    print("button 6");
                  }, child: Text("test")),
                ]),
          ),

        ],
      ),
    ),
  );
}
}

https://user-images.githubusercontent.com/5956938/108504740-aacb5a00-72b6-11eb-8c48-89c921ff5830.mov
To summarize: if a flutter widget (such as ElevatedButton) is over an HTML element that listens to any of the javascript touch events, the touch gesture (tap, long-press, ecc.) is propagated to the Flutter WebView, otherwise, it works as expected and the touch gesture is not propagated.
I'm using Flutter from "Channel master, 1.27.0-2.0.pre.43".

flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel master, 1.27.0-2.0.pre.43, on macOS 11.1 20C69 darwin-x64, locale it-IT)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode - develop for iOS and macOS
[✓] Chrome - develop for the web
[✓] Android Studio (version 4.1)
[✓] IntelliJ IDEA Ultimate Edition (version 2020.1.2)
[✓] VS Code (version 1.52.1)
[✓] Connected device (3 available)

• No issues found!

I'm writing here because there are also people having the same problem with my InAppWebView plugin.
Hope it helps to resolve this iOS issue!

If you set javascriptMode: JavascriptMode.disabled (which is the default value), flutter widgets, such as buttons, that are over the Flutter WebView widget seem to work as expected, and the touch gestures are not propagated to the WebView (WKWebView) under this buttons.

Indeed. I could reproduce this behaviour.
I'm facing the same issue on Android emulators as well as physical devices, so maybe this affects Android as well.
Output of flutter doctor :
[✓] Flutter (Channel stable, 2.0.1, on Linux, locale en_US.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
[✗] Chrome - develop for the web (Cannot find Chrome executable at google-chrome)
    ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable.
[✓] Android Studio
[✓] VS Code (version 1.54.2)
[✓] Connected device (1 available)

! Doctor found issues in 1 category.

I tried adding a GestureDetector on top of WebView, but it does not work as expected.

Okay! So I figured out the mystery.
Upon observing the gesture area debug logs, I noticed that the inner GestureDetector's (.e. WebView's parent's ) tap recognizer   was indeed receiving the tap gesture, but WebView's tap recognizer would win everytime.
I only had to figure out a way to make sure the GestureDetector always self-declares a win as soon as it receives a tap gesture.
So instead of using GestureDetector (which in turn uses the in-built tap recognizer), I made use of RawGestureDetector by giving it a custom tap recognizer.

Code for CustomTapRecognizer
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';

class CustomTapRecognizer extends OneSequenceGestureRecognizer {
  final void Function() onTap;
  Offset pointerDownPosition;

  CustomTapRecognizer({@required this.onTap});

  @override
  void addPointer(PointerEvent event) {
    if (event is PointerDownEvent) {
      startTrackingPointer(event.pointer);
      pointerDownPosition = event.position;
    } else {
      stopTrackingPointer(event.pointer);
    }
  }

  @override
  void handleEvent(PointerEvent event) {
    if (event is PointerUpEvent) {
      Offset pointerUpPosition = event.position;
      if (pointerUpPosition - pointerDownPosition == Offset.zero) {
        resolve(GestureDisposition.accepted);
      } else {
        resolve(GestureDisposition.rejected);
      }
      stopTrackingPointer(event.pointer);
    }
  }

  @override
  void acceptGesture(int pointer) {
    super.acceptGesture(pointer);
    onTap();
  }

  @override
  String get debugDescription => "tap";

  @override
  void didStopTrackingLastPointer(int pointer) {}
}

Then I used it as follows:
RawGestureDetector( // this as replacement of inner GestureDetector
  gestures: <Type, GestureRecognizerFactory>{
    CustomTapRecognizer:
        GestureRecognizerFactoryWithHandlers<CustomTapRecognizer>(
      () => CustomTapRecognizer(onTap: _onTap),
      (CustomTapRecognizer instance) {},
    )
  },
  child: SizedBox(
    child: VideoBox(_onChangeStatus), // contains WebView
    height: playerHeight,
    width: playerWidth,
  ),
),

New structure: GestureDetector > RawGestureDetector > WebView
Now suppose you have another widget over a WebView that needs to recognize a tap, say a button,
then you can create a custom widget for the button (without in-built gesture handlers) and wrap it with RawGestureDetector.
If you need other type of gestures, here are the articles that helped me understand the concepts:
Gesture disambiguation - Flutter Docs
Flutter Deep Dive: Gestures
Combining multiple GestureDetectors in Flutter

Thanks @stellarbeam but, to me, this seems more a workaround than a solution.
I think that it should already work without implementing that. Just like it would work using Flutter widgets (non-PlatformView).
I think that everyone expects this to work as it should be, that is if I put a button over another widget (that is a PlatformView or not, it shouldn't care) the button should win and capture the event (if I didn't specify some custom behaviour).

Quoting @amirh , (from here)

The TapGestureRecognizer only accepts gestures as the default winner (when there are no other recognizers the claim the gesture, Dartdoc).
A PlatformViewSurface currently always contributes a member to the arena which prevents the tap detector from winning.
In some sense this is working as intended, as the tap recognizer says "I only recognizer when I know nothing else wants the touches", and a platform view that has non transparent hit test behavior is always "interested" in the touch events.

So I guess this is the behaviour that should be expected as per gesture arena rules. But, I agree, that this current behaviour is not what will be expected by users.
This behaviour is not a bug per se, because that is what rules say, but a change would definitely be helpful.

Yeah, I hope this is something feasible for the Flutter team. Thanks again!

Mention not! Happy to contribute!

I can solve this problem by using flutter_webview_plugin. But it cannot call the display flutter component. If I use UiKitView to wrap it, will there be the same problem in iOS 13.4 and iOS 13.5?
Looking forward to your reply, it will be of great help to me. thanks


 (Feature request #7). Depends on #8.

Do we want to save the preference somewhere?

Absolutely! Now uses UserDefaults.

Awesome!


TiKV binary is not debuggable

Bug Report
Rustc generates invalid DWARF when turning on LTO
see

https://github.com/rust-lang/rust/issues/41775
https://github.com/rust-lang/rust/issues/66118

When I tried to debug tikv-sever, I got this error:
(gdb) info function Deadline
Dwarf Error: Cannot find DIE at 0x719bf5 referenced from DIE at 0x8b3ddf [in module /Users/xxxx/tikv-server]

rust-lldb also has other issues with the binary, not sure if it's related to LTO.
What version of TiKV are you using?
TiKV 4.0+
What operating system and CPU are you using?
Linux/MacOS
Steps to reproduce
Download the tikv-server release binary, run below commands
% rust-gdb ./tikv-server

(gdb) info function Deadline

What did you expect?
The binary should work with rust-gdb
What did happened?
gdb threw errors.

I suggest to
https://github.com/tikv/tikv/blob/master/Cargo.toml#L283

We should disable LTO in  https://github.com/tikv/tikv/blob/master/Cargo.toml#L283


KMSKeyArn - nil pointer segmentation

darwin_amd64
master branch, at commit 23404a9:

This is a regression due to #648
If KMSKeyArn parameter is not set il function.json we have a segmentation due to nil pointer dereference
➜  apex git:(master) ✗ go run cmd/apex/main.go -e production  -C ~/Workspace/service-checks deploy --dry-run

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x1f91aa]

goroutine 19 [running]:
panic(0x5f2a80, 0xc4200140b0)
	/usr/local/Cellar/go/1.7.5/libexec/src/runtime/panic.go:500 +0x1a1
github.com/apex/apex/function.(*Function).configChanged(0xc4201ec000, 0xc4201542c0, 0x0)
	/Users/gvisciano/Workspace/Personal/go/src/github.com/apex/apex/function/function.go:785 +0x32a
github.com/apex/apex/function.(*Function).Deploy(0xc4201ec000, 0x703d40, 0xc4201e22a0)
	/Users/gvisciano/Workspace/Personal/go/src/github.com/apex/apex/function/function.go:253 +0x164
github.com/apex/apex/project.(*Project).Deploy.func1.1(0xc4201e22a0, 0xc4201ec000, 0xc4201e2300)
	/Users/gvisciano/Workspace/Personal/go/src/github.com/apex/apex/project/project.go:203 +0x6f
created by github.com/apex/apex/project.(*Project).Deploy.func1
	/Users/gvisciano/Workspace/Personal/go/src/github.com/apex/apex/project/project.go:209 +0xb0
exit status 2

Tomorrow I will open a PR to fix the issue.
Maybe @DaveBlooman could join the review.


[CT-171] [CT-60] [Bug] It takes too long to generate docs (BigQuery)

Is there an existing issue for this?

[X] I have searched the existing issues

Current Behavior
Hi there
I have seen a similar bug here https://github.com/dbt-labs/dbt-core/issues/1576 and the issue is closed, but it appears to still be long for me to generate docs because (I believe) of the sharded tables in BQ (the ga_sessions_* from GA360)
Right now it takes around 30min and we have a little bit more of 10K tables
Expected Behavior
I would expect the dbt docs generate command to finish generating the catalog within a minute
Steps To Reproduce
No response
Relevant log output
No response
Environment
- OS:
- Python: 3.7
- dbt: 1.0.0

What database are you using dbt with?
bigquery
Additional Context
No response

Ok let me know if you want me to reopen a ticket on the dbt-biquery repo
I'll take a look see if I can come up with a fix for this on the macro in catalog.sql

We also observe this, our catalog on a BigQuery-only project takes between 10-20 minutes to generate.

@chaos87 @muscovitebob Ok! Could I ask both of you to try:

Finding the catalog query from a past run in your BigQuery query history, or
Grabbing the templated SQL for the catalog query (probably from logs/dbt.log), and try running it yourself in the console

I'd be interested to know which parts are slowest, based on what you can find in the query planner / your experimentation. If I had to guess, it might be these aggregates to get summary stats for entire tables (aggregating across all shards):
https://github.com/dbt-labs/dbt-bigquery/blob/87095c4dec1a7b64496d32e33a0f0f7390083d70/dbt/include/bigquery/macros/catalog.sql#L59-L66
Thanks in advance for your help!

Ah, ok - that's really helpful!

What's the amount of data returned by the catalog query (number of rows, approximate bytes)?
Are you able to guesstimate the amount of memory the dbt process is using / has access to?

This might be a dbt-core issue after all, since that's where turning catalog query results -> Catalog is implemented.

In my case the query returns 22,144 rows and a total result size of 12,18 MB. The subprocess spawned by the generate command always grows up to 3 GB memory consumption and stays there for the whole run.

Also it's worth mentioning that even when I use a single thread dbt, the log still logs multiple compiled SQL catalog statements one after another before going silent:
17:12:38.633863 [debug] [ThreadPool]: Acquiring new bigquery connection "project.information_schema"
17:12:38.637211 [debug] [ThreadPool]: Opening a new connection, currently in state closed
17:12:38.637498 [debug] [ThreadPool]: On project.information_schema: /* {"app": "dbt", "dbt_version": "1.0.0", "profile_name": "default", "target_name": "target", "connection_name": "project.information_schema"} */

    with tables as (
        select
            project_id as table_database,
            dataset_id as table_schema,
            table_id as original_table_name,
....

@chaos87 would you be able to run each individual query in the logs/dbt.log and see if any of them produce north of a 100k rows?

The bytes size of your result is smaller than mine but as I mentioned BQAPI seems to mostly suffer from large numbers of rows regardless of how large in bytes the actual result is. It seems there are two possible solutions to this:

Somehow push down which tables dbt is actually interested in to the catalog layer to reduce the result set we have to download.
Provide an option to use the BigQuery Storage Read API, which is how pandas-gbq solved it.

The datasets I ingest have many tables and most of them are indeed untracked by dbt (they are fivetran connector datasets that ingest everything in the databases they track), right on the money. The filtering proposal sounds good, we can fall back to a full download if it exceeds the X max number of identifiers we can settle on. I'll take a look how to do this.

"source datasets with many thousands of tables, of which a small subset are actually referenced by dbt models"
yes this is the situation I'm in

I haven't made much progress with this because it seems I am not able to debug across the dbt-bigquery dbt-core package boundary - namely I cannot step in from dbt-bigquery into code in dbt-core.

@jtcohen6 I am wondering if we actually need to do the code modifications to pass the table names instead of going with the Storage API? I noticed that in the API docs it looks like the Storage API is now plug-and-play, and even states:
dataframe = (
    bqclient.query(query_string)
    .result()
    .to_dataframe(
        # Optionally, explicitly request to use the BigQuery Storage API. As of
        # google-cloud-bigquery version 1.26.0 and above, the BigQuery Storage
        # API is used by default.
        create_bqstorage_client=True,
    )
)

I see the setup.py in this project requests google-cloud-bigquery at or above 1.25.0, so perhaps simply upgrading the version of this library will suffice to fix this usability issue. I will test this.

Hey, sorry for long silence
I have found a workaround to solve the slow to build catalog on my side
here https://github.com/dbt-labs/dbt-bigquery/blob/main/dbt/include/bigquery/macros/catalog.sql#L26
if we make is_date_shard to also work for views
(i-e REGEXP_CONTAINS(table_id, '^.+[0-9]{8}$') and coalesce(type, 0) in (1, 2) as is_date_shard)
Then the output of the get_catalog query (for 1 dataset having many sharded tables and views) with 4K views goes from 400K rows down to 1K rows
But with that said, none of the views were declared as sources or models, so the true problem is still that dbt scans objects that are out of the realm of the dbt project as @jtcohen6 mentioned

@chaos87 @muscovitebob @jtcohen6 thanks for your detailed investigation! This has been a helpful resource as we troubleshoot a similar issue on our end (error with generating BigQuery docs in dbt Cloud). We've been hitting a memory limit error even after the kind folks at dbt Labs helped to increase our dbt Cloud memory. Here are some findings in case it can help draw attention to this open issue. We still do not have docs generating at the moment...

dbt docs generate is throwing a memory limit error
dbt compile by itself takes about 35 minutes to complete
when i try dbt docs generate, I think the compiling is consuming the majority of the memory because the logs cut off shortly into the catalog building phase
I then tried to override the default macro “bigquery__get_catalog”…but haven’t quite got it right yet because I’m not sure what the data types are for the two arguments that feed into the macro when it’s called. In general, I tried to hard code some data sources in the macro CTES to pull only from the BigQuery project information schema that's needed...and separately tested filtering the where clauses to pull metadata from only the BigQuery project we care about (instead of scanning much more beyond our needed scope)…but this isn’t quite working as expected, so I tried the next thing…
I started testing dbt docs generate --no-compile (against the default catalog macro) which actually finished running successfully in about 9 minutes, but we have no docs to show for still...getting a "Not found." page when trying to open documentation in dbt Cloud.
also came across this BigQuery macro override file that Drew wrote which addresses date-shards with "date suffixes that are shorter than 8 characters"...but still not enough performance gains to complete the docs generation

Hope these takeaways can help...and open to any ideas for continuing to improve the BigQuery doc generation process, thank you!

UPDATE: was able to get docs to generate and open properly on dbt Cloud (without making any changes to the bigquery__get_catalog macro)...but ran into two separate issues and needed a hack-y workaround. For context, we have a ton of models (and unrelated BigQuery tables) which pose a challenge for generating docs.

First we hit a memory limit when trying to run dbt docs generate; we can get around that by splitting up some of the nested commands such as starting the run with dbt compile (takes 35 minutes ) and then running dbt docs generate --no-compile (9 minutes).
Then we run into a separate issue where docs are not “serving” properly online:

Currently opening docs the normal way in dbt Cloud does not work for us (by clicking on “Documentation” in the dbt Cloud hamburger menu). We get a URL with the following format: https://cloud.getdbt.com/accounts/[account_number]/jobs/[job_number]/docs/
However I found this other URL format that seems to work: https://cloud.getdbt.com/accounts/[account_number]/runs/[run_number]/docs/#!/overview
What we're doing now as a workaround is to replace the run_number in the URL above with the latest run number of our scheduled Docs job.
The interesting/hack-y thing to note is that the working URL format is something I borrowed from the GUI of dbt Cloud v0.21 ... and I believe this "Run Documentation" link is no longer present in the GUI for dbt Cloud v1.0!

Hey @kevinhoe would be good context if you put the total number of tables/views in the sources that you're using in your dbt project that you told me.
Ftr, when you pop in your own step but turn the "Generate Docs" field off - dbt Cloud will not be able to correctly server your docs - and probably the reason for your "docs are not “serving” properly online" statement.

Thanks for the context @jeremyyeo! Yes, your description is spot on for why docs are not serving properly online. I was unaware of the config in Profile Settings where one selects the job for the UI to point to in order to serve docs: https://docs.getdbt.com/docs/dbt-cloud/using-dbt-cloud/artifacts
I tested a few different scenarios, but alas, I do not think we are able to utilize the built-in feature for the UI to serve docs in dbt Cloud. More specifically, I tried checking off the box for "Generate Docs" in addition to including command steps for dbt compile and dbt docs generate --no-compile in hopes of the UI picking up the completed manifest and catalog json files from the explicit commands. Those two explicit commands completed as expected, and then the built-in command for dbt docs generate failed as expected; unfortunately the UI was not able to serve the docs with the normal way of opening docs in dbt Cloud.
So for the time being, we are left using the hack-y workaround of replacing the run_number in the url format of: https://cloud.getdbt.com/accounts/[account_number]/runs/[run_number]/docs/#!/overview

@kevinhoe added a full macro override: https://gist.github.com/jeremyyeo/f83ca852510956ba3f2f96aa079c43d5 that limits catalog query to only models/sources that are relevant to our project.

Wow! Thank you @jeremyyeo! Not sure what's more impressive - your jinja expertise or the extremely thorough documentation 😄 I'm excited to try this out and will report back on how it may improve our docs generation, thanks!
Also, I'm sharing a link you sent me in case others might find it helpful too. This is an issue that someone else opened regarding long compilation times for dbt-bigquery: https://github.com/dbt-labs/dbt-bigquery/issues/205
On the surface, that might seem like a separate issue, but my interpretation of the official dbt documentation  for the command dbt docs generate is that the compile step is a nested command within the general command of dbt docs generate?

So to summarize, when we run the generic command dbt docs generate, I think we may be running into issues with:

the compile step taking a very long time
and the docs generate [--no-compile] step (ie, the catalog step) also taking a long time

Very much appreciate your time and expertise here, Jeremy!


Possible to drag and drop a clause template into a list

Bug Report 🐛
It's possible to drag and drop a clause template into a bulleted list or numbered list
Expected Behavior
when dragging a clause template into a list, the clause template should be placed outside of the list rather than becoming part of the list
Current Behavior
When a user drags a clause template onto a bulleted list or numbered list, the clause template appears to become the first element of the list, with a bullet in front of it.

video
https://www.loom.com/share/4b53763bf2544879854bc2ac3da63eea

Hey is this bug solved? I'll like to work on this issue.

Hey is this bug solved? I'll like to work on this issue.

@sanketshevkar it looks like this bug hasn't been solved. I've assigned it to you. Thanks for volunteering! I am not an engineer, so if you have any questions about this bug, they should be directed towards @DianaLease, @irmerk, or another code maintainer.

@sanketshevkar it looks like this bug hasn't been solved. I've assigned it to you. Thanks for volunteering! I am not an engineer, so if you have any questions about this bug, they should be directed towards @DianaLease, @irmerk, or another code maintainer.

@Michael-Grover Okay sure.

@Michael-Grover Okay sure.

@Michael-Grover is there any use case wherein you'll be needing a list of clauses?

@Michael-Grover is there any use case wherein you'll be needing a list of clauses?

@sahalsaad No, I don't think so. @jeromesimeon could probably answer that question more accurately. He is busy today, but may be able to respond tomorrow.

@sahalsaad No, I don't think so. @jeromesimeon could probably answer that question more accurately. He is busy today, but may be able to respond tomorrow.

@Michael-Grover I've added a pull request for this issue. I've added both behaviours, adding clause inside as well as outside a list.

@Michael-Grover I've added a pull request for this issue. I've added both behaviours, adding clause inside as well as outside a list.


Implement AutoScroll property for ListBox (and similar controls)

So with listbox when I set the selectedItem I just want the listbox to autoscroll to that item by default.

If possible a similar property might be nice on textbox... so when it is appended it scrolls to end... or to the caret.


Broken link

Problem Description
Link for "SqlQuery::into_boxed" at https://docs.diesel.rs/diesel/query_builder/struct.BoxedSqlQuery.html results in 404
What is the expected output?
Probably it should point to https://docs.diesel.rs/diesel/query_builder/struct.SqlQuery.html#method.into_boxed
What is the actual output?
error 404

Thanks! I opened #2114.


Training with a live streaming

Really good research and thanks for sharing the source. Especially the reconstruction using Gaussian splatting in fast time seems to be a step closer to real-time reconstruction.
When doing online training, I noticed that instantNGP has a function to show the training process while receiving streaming via nerfcapture app.
You used the dataset_capture_loop function to stream the dataset to a folder and train based on it. Is it possible to apply the def live_streaming_loop function to train in real time?
And the output is supposed to be viewable in open3d. If I want to view it in nerfstudio viewer or any other viewer, please let me know where to modify it.

Thanks!
Yes, updating the code to show live training should be possible. However, we currently don't have this implemented. Furthermore, SplaTAM needs further optimization to enable faster reconstruction.
Regarding other viewers for Gaussian Splats: We support exporting our output to the standard .ply format used by various viewers like SuperSplat & PolyCam (not sure what NeRFStudio uses):
python scripts/export_ply.py configs/...


Misleading Godoc documentation

Need to fix the misleading explanation in the godoc (go.dev)  for v2
Eg

Resolver will resolve all the passed connection first DB connection is the primary-writer connection (RW), the rest connection will be used for RO connection

This is not relevant anymore

Duplicate with #12


runtime: add check before using arguments with -buildmode=c-archive and -buildmode=c-shared on non glibc systems such as musl/uclinux

This PR fixes using go .so and .a libraries with non glibc systems such as musl/uclinux when linking at compile time. This fix modifies the solution found here https://go-review.googlesource.com/c/go/+/37868
This fix does not fix the issues encountered when using dlopen on musl systems, I'm opening this PR in hopes of getting some help from the go team to fix this crippling issue using musl based systems.
Previous PR here -> https://github.com/golang/go/pull/47249
Tested with go 1.18 on 386/armv7/aarch64 with both libc and musl

Linking with https://github.com/golang/go/issues/13492


Disable "Add Settings" button until rows has input

Critical Changes
Changes

Add Settings button disabled until content of any of the setting input areas changes

Issues Closed
Fixes #251

There were three different areas I noticed this behavior was happening. I made the changes to correct this in each of these areas ( AFFILIATIONS > AFFILIATION MAPPINGS, RELATIONSHIPS > RECIPROCAL SETTINGS, RELATIONSHIPS > AUTOCREATION).

@ceiroa I removed the static resource and updated the package.xml file to accomodate.


Create an IterableDoubleStream Java goody

This would be the double-specific specialization of IterableStream, similar to the IterableIntStream introduced in #181.

hey @miorel, I'd like to take this.

Sure! This issue entails creating another sub-directory in the tools/adventure-pack/goodies/java/src directory. It should be very similar to iterable_int_stream but instead be double-specific.
I haven't really documented how to set up the development environment, but at a high-level:

If you have experience with Node.JS you can use yarn from the tools directory or from the tools/adventure-pack directory to set things up. (The main glue code for this project is in TypeScript/JavaScript.)
If you search for "java" in tools/adventure-pack/package.json you will see some of the Java-specific commands there.
If you're only developing Java code, you can also ignore all the JavaScript stuff, and use Gradle directly in the tools/adventure-pack/goodies/java directory. Notably, if you run ./gradlew compileJava in that directory that will attempt to compile the Java code.

If I can be of any assistance, let me know, I'm happy to jump on a call sometime.

ok. I'll try to setup dev environment first. will update you. Thanks!

ok. I'll try to setup dev environment first. will update you. Thanks!

hey @miorel, I believe I've setup the dev environment successfully. Just to confirm with you, I cloned the repository, installed yarn and ran "yarn install" command in tools directory. I hope it's the right way.
So, am I good to go for the actual changes related to the issue? Also, let me know any other things which I as a contributor should know (if any).
Thanks!

Nothing specific, the general practices of open source contributions apply 😄

Nothing specific, the general practices of open source contributions apply 😄
Feel free to send a pull request when you feel ready, or let me know if I can help with anything.

All right! 🙂
Thanks.

@miorel I am not been able to push to the remote.

You will have to use the workflow of creating a fork of the repository and creating a pull request through the fork. I recommend installing the GitHub command-line interface, which can do the heavy lifting for you. It will make a gh command available, then you should be able to simply run gh pr create and follow the prompts in the terminal.
See also the pull request docs.

@miorel Can you check the PR https://github.com/code-chronicles-code/leetcode-curriculum/pull/218


Question on the symmetric constraint in ProGNN

Hi, Thanks for sharing the DeepRobust code.
I've been studying the code of ProGNN. There is a operation for the symmetric constraint:

I noticed that in EstimateAdj in ProGNN.py, the process is realized by:
if self.symmetric:             adj = (self.estimated_adj + self.estimated_adj.t())
It seems that 2 is missing. Is this a mistake or a design？

Hi, thanks for pointing this inconsistency out. It should be adj = (self.estimated_adj + self.estimated_adj.t())/2 and I have just fixed the issue. I also need to note that the default Pro-GNN hyper-parameter setting does not exert the symmetric constraint; so it does not affect the reported performance.

Got it. But why doesn't the defualt setting exert the symmetric constraint,? It seems different from the paper. What effects will it have if using the constraint.

We treat this constraint as a hyper-parameter. And it turns out that without this constraint the performance is better.

Got it. Thanks.


Added note for debugging with serve configurations

Category

[x] Content fix
[ ] New article
Related issues: mentioned in #2125

What's in this Pull Request?
Added note for debugging with serve configurations as suggested in #2125

:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

docs/spfx/extensions/get-started/using-page-placeholder-with-extensions.md
:white_check_mark:Succeeded
View

For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.

thx Chris, appreciated.


added some more details in troubleshooting section

added some more details in troubleshooting section related to source database connection retry

LGTM, minor spellchecks and formatting errors in the prereqs, suggested a rewrite


Suggestion: Roles from "users" do not affect anything, so why exists?

admin->Users page is just about creating the user and
admin->User journal roles is about the assigning roles and matching with the journals.
Also if I assign a role from the users page; it is no affect on anything as far as I know. So I think it can be removed from that page.

I do not need to assign a role..

I can assign a role from there;

Role field on users pages for only system roles. But Journal Role Page is required for journal<->user relation .

But it does not affect anything. If I choose author from the users page for an user, what is going to happen?

I will hide this field, user form.

same as #514


Use falcoctl 0.0.3 w/ unique names

Use the changes in https://github.com/falcosecurity/falcoctl/pull/25
that make sure rules, macros, lists, and rule names all have a unique
prefix. In this case the prefix is based on the psp name, so make sure
the psp name actually reflects what it does--there were a few
cut-and-paste carryovers.
This test assumes that falcoctl will be tagged/released as 0.0.3--the
tests won't pass until the falcoctl PR is merged and there's a release.
Signed-off-by: Mark Stemm<EMAIL_ADDRESS>
What type of PR is this?

Uncomment one (or more) /kind <> lines:

/kind bug

/kind cleanup

/kind design

/kind documentation

/kind failing-test

/kind feature

/kind flaky-test

If contributing rules or changes to rules, please make sure to also uncomment one of the following line:

/kind rule-update

/kind rule-create

Any specific area of the project related to this PR?

Uncomment one (or more) /area <> lines:

/area build

/area engine

/area examples

/area rules

/area integrations

/area tests

/area proposals

What this PR does / why we need it:
Which issue(s) this PR fixes:

Fixes #
Special notes for your reviewer:
Does this PR introduce a user-facing change?:

Allow for unique names for psp converted rules/macros/lists/rule names as generated by falcoctl 0.0.3

[APPROVALNOTIFIER] This PR is NOT APPROVED
This pull-request has been approved by:
To fully approve this pull request, please assign additional approvers.
We suggest the following additional approver: mstemm
If they are not already assigned, you can assign the PR to them by writing /assign @mstemm in a comment when ready.
The full list of commands accepted by this bot can be found here.
The pull request process is described here

Needs approval from an approver in each of these files:

OWNERS

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Thanks for your pull request. Before we can look at it, you'll need to add a 'DCO signoff' to your commits.
:memo: Please follow instructions in the contributing guide to update your commits with the DCO
Full details of the Developer Certificate of Origin can be found at developercertificate.org.
The list of commits missing DCO signoff:

0b885d6 Update path for falcoctl binary.

Instructions for interacting with me using PR comments are available here.  If you have questions or suggestions related to my behavior, please file an issue against the kubernetes/test-infra repository. I understand the commands that are listed here.

LGTM label has been added.  Git tree hash: d7757cfecacb606ab0a423dd9f09480b5c69194f

[APPROVALNOTIFIER] This PR is APPROVED
This pull-request has been approved by: fntlnz
The full list of commands accepted by this bot can be found here.
The pull request process is described here

Needs approval from an approver in each of these files:

OWNERS [fntlnz]

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment


Can we lift minting per one address for holderOf?

Can we lift that limit, to 30 per address, as default?

28 is the total amount of the holderOf nfts that you have
10 is the amount of ntfts that are not been used for claim drop.
In short, there is no minting limit for per address, as long as you have enough nfts that not been used.

10 is the amount of ntfts that are not been used for claim drop.

well thing is that was when was drop launched I had this and haven't minted any. So how it's possible?
After mint 10 of them I can't mint :D

Oh I found the bug. Thanks for testing : )


chore(package.json): update esdoc to 0.4.6

I just noticed code coverage check on PR is missing. (pretty sure not relevant to PR itself, most of PR misses it) CoverAlls seems somewhat fragile..

Merged with 2ae6da5, thanks @staltz


Small code improvements

Codecov Report

Merging #3339 into dev will decrease coverage by <1%.
The diff coverage is 55%.

@@          Coverage Diff           @@
##             dev   #3339    +/-   ##
======================================
- Coverage     80%     80%   -<1%
======================================
  Files        356     356
  Lines      28226   28179    -47
  Branches    3763    3751    -12
======================================
- Hits       22581   22537    -44
+ Misses      4560    4535    -25
- Partials    1085    1107    +22


Suggestions: Make all iam roles/policies to be optional

I was trying it out and a few things on our account are already managed by other modules, so it will be great to not have more roles and policies that we already have.
For that, I've put a few more variables on the iam-baseline sub-module so we could disable the roles/policies creation.
This doesn't affect the people that are already using the module since the default value is set to create all roles but could help others that will try to use it on an account already in use.
I'll open a PR with the changes to review!
Thanks for the work on that, it's a pretty good module and will help us a lot!

@igordcsouza sorry for the delay, #115 has been merged and published in v0.19.0!


VersionBot: Retry git clone operation should it initially fail due to authentication issues

Occasionally there's an issue where the initial attempt to clone doesn't work, where Github
claims authentication is incorrect. It appears on subsequent attempts, this works. To combat
this, VersionBot will now attempt a clone up to three times.

Should the clone fail, a sanitised comment is made on the PR
Additionally, the code to use local processes has been moved out of VersionBot and into
a utility component called 'environment'. The allows a Client Bot to build a command and
then execute it (and hence the minor semver)
The gulp file has been cleaned up to remove the need to copy declarations (which we shouldn't
need)
The CHANGELOG.md has been retroactively updated, to specify which Client Bot the change
pertains to (or the overall ProcBots framework)

Connects-to: #166
Change-type: minor
---- Autogenerated Waffleboard Connection: Connects to #166

Does this only affect clone operations, or are there other Github operations where retrying might be beneficial?

@lurch Currently this is the only reasonable one to apply this to in VB as it relies on an external source. If any of the others fail, retrying will not help (running versionist etc.).


refactor: introduce api clusters type

Explanation
Introduce api clusters type.

/cherry-pick release-0.2


docs: add feedback to the analytics section in mkdocs.yml

The Issue
@rfay is currently trying to add search priorities for the search field on ddev.readthedocs.com to prioritize search results (https://github.com/ddev/ddev/pull/5500). The problem is there is currently no direct way for a visitor to provide some sort of in context feedback about the search results and the docs page the person was pointed to in particular. Therefore there is no direct way to get an idea about potential problems and ambiguities users face in the docs experience.
How This PR Solves The Issue
There is the option to add a Was this page helpful?widget to each docs page in mkdocs (see https://squidfunk.github.io/mkdocs-material/setup/setting-up-site-analytics/#was-this-page-helpful). It is basically adding two icons (thumbs up and thumbs down) at the bottom of the page. on thumbs up everything was all right and it is forwarding the value 1 to the analytics software (per default google analytics - not sure how well it will work with plausible). on thumbs down the value 0 is forwarded to analytics and there is the option to leave a comment what actually went wrong. out of the box the mkdocs outline two options. squidfunk itself uses google forms. on the upside that doesnt require any account but on the downside it has gdpr implications therefore i would would vote against it. in addition there is also no way to get a reply to your feedback. so if you have a question you as the person providing a feedback depend on the maintainers to act on your feedback and solve your issue or provide some sort of reaction proactively. the other option is to instead of pointing a google form link to simply point to a github issue. the downside is a person reporting needs to have a github account but on the upside the maintainers have a direct way to provide some actual feedback on the feedback. i consider that a way better experience and a win win for both sides.
i've created an initial PR #5499 where the github feedback link points to
https://github.com/ddev/ddev/issues/new/?title=[Feedback]+{title}+-+{url}&labels= documentation&template=bug_report.yml
creating a bug_report with a label of documentation. until a dedicated repo for mkdocs feedback is set up. otherwise the ddev queue might be "spammed". and i wanted to put the PR up to get some feedback on the microcopy for the ratings and the widget in general. as soon as the other repo is created the link could be changed to something like this:
https://github.com/ddev/mkdocs-feedback/issues/new/?title=[Feedback]+{title}+-+{url}&labels=feedback&template=mkdocs_feedback.yml
any thoughts and or feedback?
Manual Testing Instructions
Automated Testing Overview

Related Issue Link(s)
Release/Deployment Notes

oh it looks like it might only work with google analytics according to the following comment on one issue: https://github.com/squidfunk/mkdocs-material/issues/4151#issuecomment-1312093549
cuz when i've taken a look at the docs preview the feedback widget isnt showing up :/

How can I manually test this? I visited https://ddev--5503.org.readthedocs.build/en/5503/users/providers/ for example, and see nothing.
Please fill in the manual testing section.
You reference https://github.com/ddev/ddev/pull/5499 but it doesn't seem to have anything to do with this.

Rebased to current (where search priorities are in there)

How can I manually test this? I visited https://ddev--5503.org.readthedocs.build/en/5503/users/providers/ for example, and see nothing.

As mentioned on Discord it looks like that the feature requires Google Analytics. i've also added the link in the comment here for reference: https://github.com/ddev/ddev/pull/5503#issuecomment-1793462972
The docs were sort of misleading, creating the impression it would work with analytics in general in stead of requiring Google Analytics :/ not sure if there would be a way to use it with plausible as well.

Please fill in the manual testing section.
You reference #5499 but it doesn't seem to have anything to do with this.

That was an error. No idea how i added that PR number. I've updated the issue summary. thanks for the note!

Should we close this if it requires Google Analytics?

Probably the best choice except adding support for another analytics software would be super easy and simple. basically it might be only one or two functions and it might be possible to use the GA code as a template for plausible.

So the obvious path forward is just to close this because it can't work with Plausible?

Then let's close the issue for now. And in case some new movement comes in (perhaps some way to get plausible integrated into mkdocs) then reopen this issue.


Remove Jersey dependencies

Since we use Netty, it's pointless to depend on Jersey (comes from docker-java)

This is great 😄
I think I tried this before but didn't think to re-add the jaxrs-api dependency.
👍 !

Ah, just one request - could you update the changelog?

@rnorth done :)

Looks like Travis had a wobble - will re-run.

All green so will merge.


P4VFS Download File Size Acquisition Abnormal

After I use P4VFS to download a file, the size obtained through the stat function or the size function of the filesystem is wrong，Only after the file is actually downloaded, the obtained size is correct

Duplicate:  https://github.com/microsoft/p4vfs/issues/3


capture of erb content in a nested component not behaving as expected

I'm trying to build a component with a nested component, similar to the example on the homepage, though capturing multiple blocks of content in the nested one. A parent component with title, then a (collection of) nested component(s) which each do two captures in order to produce rows with 'left' and 'right' content.
What I'm finding is that in the nested component, the blocks of content I'm trying to capture are a) being written to the output before the component itself renders and then b) when rendered into the component, the content produced by an erb tag within that content is then missing.
Parent component:
class CardComponent < ApplicationComponent
  include Phlex::DeferredRender

  attr_accessor :title

  def template
    div(class: "overflow-hidden bg-white shadow sm:rounded-lg") do
      div(class: "px-4 py-5 sm:px-6") do
        h3(class: "text-base font-semibold leading-6 text-gray-900") do
          title
        end
      end

      div(class: "border-t border-gray-200 px-4 py-5 sm:p-0") do
        dl(class: "sm:divide-y sm:divide-gray-200") do
          rows.each do |row|
            render(row)
          end
        end
      end
    end
  end

  def add_row(...)
    rows << CardRowComponent.new(...)
  end

  def rows
    @rows ||= []
  end
end

Nested component:
class CardRowComponent < ApplicationComponent
  include Phlex::DeferredRender

  def template
    div(class: "py-4 sm:grid sm:grid-cols-3 sm:gap-4 sm:py-5 sm:px-6") do
      dt(class: "text-sm font-medium text-gray-500") do
        left
      end
      dd(class: "mt-1 text-sm text-gray-900 sm:col-span-2 sm:mt-0") do
        right
      end
    end
  end

  def left(&block)
    if block_given?
      @left = block
    else
      capture(&@left)
    end
  end

  def right(&block)
    if block_given?
      @right = block
    else
      capture(&@right)
    end
  end
end

Used in a typical Rails erb view (a fresh Rails 7 codebase):

  <%= render CardComponent.new do |card| %>
    <% card.title = 'Item details' %>

    <% card.add_row do |row| %>
      <% row.left do %>
        Length
      <% end %>
      <% row.right do %>
        <%= @vessel.length_ft %>ft
      <% end %>
    <% end %>
  <% end %>

Result, showing how the content in the left and right blocks have been rendered before the component (@vessel.length_ft = 27.0):

With markup:

  Length
  27.0ft

Item details

            Length

            ft

Thanks, loving my Phlex experience so far. 🙏

Hey @jongilbraith, which version of Phlex are you using? We introduced "global capture" in 1.5 to fix this issue, though I should mention it seems to be causing problems with memory which I’m trying to fix in #524.

I just read your example, and I don't think you need to use capture here at all. You should be able to use yield_content instead.

yield_content is a confusing concept. I’m considering merging it into render so you could just render @left.

Hey @joeldrapper thanks for the quick response(s). I was (I think) originally using 1.5.1 and have experimented with pointing my Gemfile to main.

I just read your example, and I don't think you need to use capture here at all. You should be able to use yield_content instead.

Ahh, ok, I'll check out yield_content and give that a try. Yeah, it's been a while since I've dug into this part of Rails (Phlex is bring back ideas I was having and trying to put into action when I first got into Ruby/Rails) and it's still just as confusing as I remember!

yield_content is basically yield(self) but it's also how we can use the returned text content of the block if yielding the block doesn't mutate the buffer.

I've stripped things out a bit to minimise the moving parts and tried this:
class CardRowComponent < ApplicationComponent
  include Phlex::DeferredRender

  def template
    div(class: "py-4 sm:grid sm:grid-cols-3 sm:gap-4 sm:py-5 sm:px-6") do
      dt(class: "text-sm font-medium text-gray-500") do
        yield_content(&@left)
      end
      dd(class: "mt-1 text-sm text-gray-900 sm:col-span-2 sm:mt-0") do
        yield_content(&@right)
      end
    end
  end

  def left(&block)
    @left = block
  end

  def right(&block)
    @right = block
  end
end

But unfortunately still doing weird things:

However, a really weird thing happening when I (while just trying random things) remove the = from the erb in the view's right block, so the row block is as follows:
    <% card.add_row do |row| %>
      <% row.left do %>
        Design
      <% end %>
      <% row.right do %>
        <% @vessel.design %>
      <% end %>
    <% end %>

Now, the content does appear within the component but has also disappeared from outside of it. 🤔
I've also seen other strange patterns involving just the first row when I reinstate some of the additional add_row entries. Very weird.

@joeldrapper have tried a few different approaches (such as replacing the left and right methods with instances of a new component) and seeing similar outcomes.
I probably need to put this aside for the time being so I can push on with the spike I'm working on, but would it be of help for me to recreate these in a sample app for you to have a go yourself with?

Hey @jongilbraith, you've definitely found a bug. I’m moving this issue to phlex-rails and I’ll try to find a fix.


removeDataPoint doesn't work

Expected Behaviour
https://jsfiddle.net/vqbLugjh/
All 7 data points should be removed on load.
Documentation: https://frappe.io/charts/docs/update_state/modify_data
Actual Behaviour
None of the data is removed.
Frappé Charts version: 1.1.0

It seems that is is not impemented yet
https://github.com/frappe/charts/blob/master/src/js/charts/PercentageChart.js
so it falls back to the placeholder which does nothing
https://github.com/frappe/charts/blob/master/src/js/charts/BaseChart.js#L305


Skip non-existing files.

don't need the curly braces, and definitely don't need it on a line by itself :)
+1 assuming you rremove them.


Received malformed response from transform :count

If there is % anywhere in CloudFormation template, it gives below error.
Received malformed response from transform 12345XXXXX::Count
For example:
  DiskSpaceAlarm:
    Type: AWS::CloudWatch::Alarm
    Count: !Ref Instancescount
    Properties:
      AlarmDescription: Over 95 of volume space is in use
      AlarmActions:
      - !Ref SNSTopicEc2
      MetricName: "% Free Space"

There should be either some 'delimiter' or lambda should consider only specific (e.g. %d) as a placeholder not all %.

This issue does not appear to be related to the use of % in the template but instead the use of a !Ref to supply the value of the Count property. The Count property only supports specific values and not references, I believe if you re-test using your example and just change Count: !Ref Instancescount to Count: 2 you should find the error does not occur. Could you please confirm this?

This issue does not appear to be related to the use of % in the template but instead the use of a !Ref to supply the value of the Count property. The Count property only supports specific values and not references, I believe if you re-test using your example and just change Count: !Ref Instancescount to Count: 2 you should find the error does not occur. Could you please confirm this?

Also, there is a more up to date version of this macro in this repo here, that version of the Macro does support using !Ref so perhaps it might be worth deplying that version instead?

We are archiving this repository in favor of similar content located here: https://github.com/aws-cloudformation/aws-cloudformation-templates/tree/main/aws/services/CloudFormation/MacrosExamples


scope.froalaOptions is undefined

I created a own directive wrapping a textarea with the frola attribute. In my directive i defined some options
scope.options = {   placeholderText: $attr.placeholder,   toobarButtons: [     'fullscreen', 'bold', 'italic', 'underline', 'strikeThrough',     'paragraphFormat', 'formatOL', 'formatUL', 'quote',      'insertLink','|', 'undo', 'redo',   ], };
and pass them to the frola directive like this
<textarea froala="options" ng-model="html"></textarea>.
The defined options take no effekt on the editor.
I did some debugging and found out that scope.froalaOptions is undefined in this line
https://github.com/froala/angular-froala/blob/abd92b30097a7458929a0a822e54583cb5de64fd/src/angular-froala.js#L103

In the directive you have defined
scope.options = { placeholderText: $attr.placeholder, toobarButtons: [ 'fullscreen', 'bold', 'italic', 'underline', 'strikeThrough', 'paragraphFormat', 'formatOL', 'formatUL', 'quote', 'insertLink','|', 'undo', 'redo', ], };
$attr should be defined first in your code else it will show error that $attr is not defined and that is the reason behind getting the error of scope.froalaOptions is undefined.
If you remove the $attr.placeholder it will work fine.