)]}'
{
  "commit": "40ef139ceda28c2390b3cb53fa2785d5ed690602",
  "tree": "2462b624ea55edb83bfe93cde3cf63ef6e175aaf",
  "parents": [
    "b48dd36fccc6edf6b37a0291a90d3efccd8d2b78"
  ],
  "author": {
    "name": "Amir Hardon",
    "email": "amirh@users.noreply.github.com",
    "time": "Fri Aug 09 16:35:47 2019 -0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Aug 09 16:35:47 2019 -0700"
  },
  "message": "[webview_flutter] Filter onChanged events for invalid displays (#1964)\n\nWorks around an Android WebView bug that was causing a crash by filtering some DisplayListener invocations.\r\n\r\nOlder Android WebView versions had assumed that when DisplayListener#onDisplayChanged is invoked, the display ID it is provided is of a valid display. However it turns out that when a display is removed Android may call onDisplayChanged with the ID of the removed display, in this case the Android WebView code tries to fetch and use the display with this ID and crashes with an NPE.\r\n\r\nThe issue was fixed in the Android WebView code in https://chromium-review.googlesource.com/517913 which is available starting WebView version 58.0.3029.125 however older webviews in the wild still have this issue.\r\n\r\nSince Flutter removes virtual displays whenever a platform view is resized the webview crash is more likely to happen than other apps. And users were reporting this issue see: flutter/flutter#30420\r\n\r\nThis change works around the webview bug by unregistering the WebView\u0027s DisplayListener, and instead registering our own DisplayListener which delegates the callbacks to the WebView\u0027s listener unless it\u0027s a onDisplayChanged for an invalid display.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "eb7b1bc4684f780d300bb6acfcdbd0d8b27cc47d",
      "old_mode": 33188,
      "old_path": "packages/webview_flutter/CHANGELOG.md",
      "new_id": "6e7f498968f0af47d393f73dcc3dda4a97fe5509",
      "new_mode": 33188,
      "new_path": "packages/webview_flutter/CHANGELOG.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9335f6f37fcf549feaa3efeb8e254fc950313be7",
      "new_mode": 33188,
      "new_path": "packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/DisplayListenerProxy.java"
    },
    {
      "type": "modify",
      "old_id": "80431ad4cd5b933e6e4f11068e14a07f58f8fe0a",
      "old_mode": 33188,
      "old_path": "packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java",
      "new_id": "e089f6d28190371b04c919906675369c9ab9fbec",
      "new_mode": 33188,
      "new_path": "packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java"
    },
    {
      "type": "modify",
      "old_id": "f471b69fb7d1fc9a793fef93c8e8c6dfc1727756",
      "old_mode": 33188,
      "old_path": "packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj",
      "new_id": "61ee7d2d409360e74b9c440ca4c22a9fa8a30ca5",
      "new_mode": 33188,
      "new_path": "packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj"
    },
    {
      "type": "modify",
      "old_id": "b6abff94e6b297d8d885cd191cb9838e314e7454",
      "old_mode": 33188,
      "old_path": "packages/webview_flutter/example/test_driver/webview.dart",
      "new_id": "fefaf6d49bef49585dce585b3b09f092a93ec5fa",
      "new_mode": 33188,
      "new_path": "packages/webview_flutter/example/test_driver/webview.dart"
    },
    {
      "type": "modify",
      "old_id": "6cde699ea33694e39560ef344f46ddc4fc4828da",
      "old_mode": 33188,
      "old_path": "packages/webview_flutter/pubspec.yaml",
      "new_id": "9999ca9519b37c2f4e81c6dd97e3c212dc1a3dbb",
      "new_mode": 33188,
      "new_path": "packages/webview_flutter/pubspec.yaml"
    }
  ]
}
