expose the debugProfileBuildsEnabled flag as a service extension (#21492)

* expose the debugProfileBuildsEnabled flag as a service extension

* fix tests

* review comments

* remove a new keyword

* test fixes

* review comments
diff --git a/packages/flutter/lib/src/widgets/binding.dart b/packages/flutter/lib/src/widgets/binding.dart
index 42efe2c..67bc1c4 100644
--- a/packages/flutter/lib/src/widgets/binding.dart
+++ b/packages/flutter/lib/src/widgets/binding.dart
@@ -14,6 +14,7 @@
 import 'package:flutter/services.dart';
 
 import 'app.dart';
+import 'debug.dart';
 import 'focus_manager.dart';
 import 'framework.dart';
 import 'widget_inspector.dart';
@@ -268,7 +269,10 @@
 
     registerSignalServiceExtension(
       name: 'debugDumpApp',
-      callback: () { debugDumpApp(); return debugPrintDone; }
+      callback: () {
+        debugDumpApp();
+        return debugPrintDone;
+      }
     );
 
     registerBoolServiceExtension(
@@ -293,6 +297,19 @@
       }
     );
 
+    assert(() {
+      // Expose the ability to send Widget rebuilds as [Timeline] events.
+      registerBoolServiceExtension(
+        name: 'profileWidgetBuilds',
+        getter: () async => debugProfileBuildsEnabled,
+        setter: (bool value) async {
+          if (debugProfileBuildsEnabled != value)
+            debugProfileBuildsEnabled = value;
+        }
+      );
+      return true;
+    }());
+
     // This service extension is deprecated and will be removed by 7/1/2018.
     // Use ext.flutter.inspector.show instead.
     registerBoolServiceExtension(
diff --git a/packages/flutter/test/foundation/service_extensions_test.dart b/packages/flutter/test/foundation/service_extensions_test.dart
index 6fcb04f..de2950f 100644
--- a/packages/flutter/test/foundation/service_extensions_test.dart
+++ b/packages/flutter/test/foundation/service_extensions_test.dart
@@ -298,6 +298,35 @@
     expect(binding.frameScheduled, isFalse);
   });
 
+  test('Service extensions - profileWidgetBuilds', () async {
+    Map<String, dynamic> result;
+
+    expect(binding.frameScheduled, isFalse);
+    expect(debugProfileBuildsEnabled, false);
+
+    result = await binding.testExtension('profileWidgetBuilds', <String, String>{});
+    expect(result, <String, String>{ 'enabled': 'false' });
+    expect(debugProfileBuildsEnabled, false);
+
+    result = await binding.testExtension('profileWidgetBuilds', <String, String>{ 'enabled': 'true' });
+    expect(result, <String, String>{ 'enabled': 'true' });
+    expect(debugProfileBuildsEnabled, true);
+
+    result = await binding.testExtension('profileWidgetBuilds', <String, String>{});
+    expect(result, <String, String>{ 'enabled': 'true' });
+    expect(debugProfileBuildsEnabled, true);
+
+    result = await binding.testExtension('profileWidgetBuilds', <String, String>{ 'enabled': 'false' });
+    expect(result, <String, String>{ 'enabled': 'false' });
+    expect(debugProfileBuildsEnabled, false);
+
+    result = await binding.testExtension('profileWidgetBuilds', <String, String>{});
+    expect(result, <String, String>{ 'enabled': 'false' });
+    expect(debugProfileBuildsEnabled, false);
+
+    expect(binding.frameScheduled, isFalse);
+  });
+
   test('Service extensions - evict', () async {
     Map<String, dynamic> result;
     bool completed;
@@ -512,7 +541,7 @@
 
     // If you add a service extension... TEST IT! :-)
     // ...then increment this number.
-    expect(binding.extensions.length, 38);
+    expect(binding.extensions.length, 39);
 
     expect(console, isEmpty);
     debugPrint = debugPrintThrottled;