0+tNJRk#?aW=4>iC|!Q
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
literal 0
HcmV?d00001
diff --git a/dev/a11y_assessments/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/dev/a11y_assessments/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d
GIT binary patch
literal 1888
zcmeAS@N?(olHy`uVBq!ia0y~yVDJH94mJh`hU3!%wHX-L)jeGtLn>~)ol~77;wp3e
zd*9(B^+)V|Sb7bYEevxsNN95Ly>R5pG><4!#}uyGs~mG-mhw@#=)jY|P(&$f
z(L{!c<|0R&xLsVAeA3`bV(L)P-SU0k-1Wx0t*`Gaz6}C*cPCHEH}hRrY(4+)xqLb6
z?~|7>axw5eng)r>M#OO6het&Tdk2
zjXO>(+e6iPSaKw;noN1MNY&D7-9
z9Z#(y_{7gW;WTWkedtzxQflox4oCOxJ(tZ>=XklBr<7cJy-_c6<>4pH4?fl?x10LB
zUanWU;8yb0cTa*E9!y=F=<`RhcVRJK?2;*CnExqm)o;lS
z(_0muYo!}TY}Q!gDH0YN&0*T!lU-HKk;?A$3ME+W%-nlh&G(
zYqi#7w)d=_SNG47E1R)ZRCQX3>^`9zM;c0Z98ElV&WL;Ul!LD}@Jx$1`kp6Zy7Z&z
zq35)=UW+`bs<1OLr6kk*if+)p16o@dr#(JUbTYD!d9&7m+nlEj6L!APIo|Me)n*yS
zw9JP08|0_0J)rZpjql(l-Wg8~z02~J>E3O6s+2Iz-%GY_YG}gGXKU6lo&LJAdF_Eu
zlGC0ZND6zGzEfb@(gQJjem=KL*tyO1v4+9!Ij%-iv>R?dT(jrpq_Uig0uOhuYvcIG
zyL@?eNUUJf=`V8Ci}{!y^X{DEn*NdfQ9tARe^P<>OwDBY65Vze?sc$_FEwb{dHfKU
zgZ8fFDQsewcg8i%bU$=TI&Jk_)k9U!Dt5c6&wE?JMFt*Z-FYo0As$ecG9_
zqm#{3o~{hfG@mXTA-MG7*Qmd4_bNWWPjKg!s^@yVi_Ke2@5Q9_>W-pf(Y41GEPbuR
zrXBnJTB=}}o8$cRuWr7SDC<)cH8I}s%J&F!S$;|s5X-lTtY`+C7ri2H`K`R|V*
z-U6n%?^;q{KC-@>0}Nr`<`
zdy7|@ZO+jI+fB+1?c3Nt7=&(Q%qX+gel6W0{>Me~V~<7m;YVJqXEh@tZ!db6|Iuc`
z=1HRM+qU!H3TaPF{i@3GlKqauxmV(|o^841>^Mc9!-`FN^?@%BHZHz@M$s)n)meJ~
z@%~lcG^FbLG`KU>6K=Bg{1-~Tc2VHnttZD9mze0>%;TBClpC$zRes!{?(_W@T&sSY
z7~Y&Y*Qi=%8KZTL@39%Nj3T+b2}>N?r{=sp+94)+c>f>ndtI&-nJ44kDhe#Uw}(Zo
zY<~Q%l%9K;JW(gF$#Hcr$T&RzL#TdJ`7JLG;pq>LF8zJgD)slmn^ku-XR&Rui+KKU
zbp*%CEY3Y&eI;xba|ZnkI=d!JZ8gy^*`Pg~05HAUF3_{)t-pO$Th`yYuVR1~wb^{#6$
zS;cm56aRyiaZ=?|=e=or_JdzKWVxWs`)MB&K5JIYpTnE~vPLwh*7)kJy2QepH*F;i
zj@KU*yZTHfSN+^$J~OUsYn%I>K3rMn$N9S6&s)OQGpyn6l}L4K_P1~BB`!HE3|-%p
zUo|-~!OT+kNWfPS=GuGf-tOyv(_)X+zuy~uCi>%+*^eR~>9s#z_T1;xqn+hj
zUhA1VcV9|noLx0zs^_~oM;k4)S9EqoD9uY+#UM1fU$p4qO3gzd%9D%Ve`s+v-pcQu
z=NK%p!6@2XU+I_7y4oY`tC(8dSR%TEQ&&Fri(YZLpL=1)!;Fm+R$ZBFB&)f1-?F17
zae;Qnx6Mf45!-yvfW@2rR>rEmR#Q(~^7;GtYKd*rsW_9P7jF15m-VV&?zY+as%vI0
zx>fQh`l0;ZMXIL9_quOo&+2*<(N|_a?c
O7(8A5T-G@yGywok=Zg*i
literal 0
HcmV?d00001
diff --git a/dev/a11y_assessments/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/dev/a11y_assessments/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a84f41e14e27f4b11f16f9ee39279ac98f8d5ac
GIT binary patch
literal 3294
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
literal 0
HcmV?d00001
diff --git a/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000000..0bedcf2fd4
--- /dev/null
+++ b/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0y~yU|@r242}Q*
literal 0
HcmV?d00001
diff --git a/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0y~yU|@r242}Q*
literal 0
HcmV?d00001
diff --git a/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0y~yU|@r242}Q*
literal 0
HcmV?d00001
diff --git a/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 0000000000..89c2725b70
--- /dev/null
+++ b/dev/a11y_assessments/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/dev/a11y_assessments/ios/Runner/Base.lproj/LaunchScreen.storyboard b/dev/a11y_assessments/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000000..f2e259c7c9
--- /dev/null
+++ b/dev/a11y_assessments/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/a11y_assessments/ios/Runner/Base.lproj/Main.storyboard b/dev/a11y_assessments/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 0000000000..f3c28516fb
--- /dev/null
+++ b/dev/a11y_assessments/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dev/a11y_assessments/ios/Runner/Info.plist b/dev/a11y_assessments/ios/Runner/Info.plist
new file mode 100644
index 0000000000..74b9bb41e7
--- /dev/null
+++ b/dev/a11y_assessments/ios/Runner/Info.plist
@@ -0,0 +1,49 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ A11y Assessments
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ a11y_assessments
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/dev/a11y_assessments/ios/Runner/Runner-Bridging-Header.h b/dev/a11y_assessments/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 0000000000..95b7baf386
--- /dev/null
+++ b/dev/a11y_assessments/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1,5 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "GeneratedPluginRegistrant.h"
diff --git a/dev/a11y_assessments/ios/RunnerTests/RunnerTests.swift b/dev/a11y_assessments/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 0000000000..6bfa573763
--- /dev/null
+++ b/dev/a11y_assessments/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,16 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/dev/a11y_assessments/lib/main.dart b/dev/a11y_assessments/lib/main.dart
new file mode 100644
index 0000000000..9bf39a96c8
--- /dev/null
+++ b/dev/a11y_assessments/lib/main.dart
@@ -0,0 +1,65 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+
+import 'use_cases/use_cases.dart';
+
+void main() {
+ runApp(const App());
+}
+
+class App extends StatelessWidget {
+ const App({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+
+ final Map routes = Map.fromEntries(
+ useCases.map((UseCase useCase) => MapEntry(useCase.route, useCase.build)),
+ );
+ return MaterialApp(
+ title: 'Accessibility Assessments',
+ theme: ThemeData(
+ colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
+ useMaterial3: true,
+ ),
+ routes: {
+ '/': (_) => const HomePage(),
+ ...routes
+ },
+ );
+ }
+}
+
+class HomePage extends StatelessWidget {
+ const HomePage({super.key});
+
+ Widget _buildUseCaseItem(UseCase useCase) {
+ return Padding(
+ padding: const EdgeInsets.all(10),
+ child: Builder(
+ builder: (BuildContext context) {
+ return TextButton(
+ key: Key(useCase.name),
+ onPressed: () => Navigator.of(context).pushNamed(useCase.route),
+ child: Text(useCase.name),
+ );
+ }
+ )
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(title: const Text('Accessibility Assessments')),
+ body: Center(
+ child: ListView(
+ children: useCases.map(_buildUseCaseItem).toList(),
+ ),
+ ),
+ );
+ }
+}
diff --git a/dev/a11y_assessments/lib/use_cases/check_box_list_tile.dart b/dev/a11y_assessments/lib/use_cases/check_box_list_tile.dart
new file mode 100644
index 0000000000..ecdf03427a
--- /dev/null
+++ b/dev/a11y_assessments/lib/use_cases/check_box_list_tile.dart
@@ -0,0 +1,46 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+
+import 'use_cases.dart';
+
+class CheckBoxListTile extends UseCase {
+
+ @override
+ String get name => 'CheckBoxListTile';
+
+ @override
+ String get route => '/check-box-list-tile';
+
+ @override
+ Widget build(BuildContext context) => _MainWidget();
+}
+
+class _MainWidget extends StatefulWidget {
+ @override
+ State<_MainWidget> createState() => _MainWidgetState();
+}
+
+class _MainWidgetState extends State<_MainWidget> {
+ bool _checked = false;
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(title: const Text('CheckBoxListTile')),
+ body: Center(
+ child: CheckboxListTile(
+ value: _checked,
+ onChanged: (bool? value) {
+ setState(() {
+ _checked = value!;
+ });
+ },
+ title: const Text('a check box list title'),
+ ),
+ ),
+ );
+ }
+}
diff --git a/dev/a11y_assessments/lib/use_cases/check_box_list_tile_disabled.dart b/dev/a11y_assessments/lib/use_cases/check_box_list_tile_disabled.dart
new file mode 100644
index 0000000000..fe4d7e2be0
--- /dev/null
+++ b/dev/a11y_assessments/lib/use_cases/check_box_list_tile_disabled.dart
@@ -0,0 +1,47 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+
+import 'use_cases.dart';
+
+class CheckBoxListTileDisabled extends UseCase {
+
+ @override
+ String get name => 'CheckBoxListTile Disabled';
+
+ @override
+ String get route => '/check-box-list-tile-disabled';
+
+ @override
+ Widget build(BuildContext context) => _MainWidget();
+}
+
+class _MainWidget extends StatefulWidget {
+ @override
+ State<_MainWidget> createState() => _MainWidgetState();
+}
+
+class _MainWidgetState extends State<_MainWidget> {
+ bool _checked = false;
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(title: const Text('CheckBoxListTile Disabled')),
+ body: Center(
+ child: CheckboxListTile(
+ value: _checked,
+ onChanged: (bool? value) {
+ setState(() {
+ _checked = value!;
+ });
+ },
+ title: const Text('a disabled check box list title'),
+ enabled: false,
+ ),
+ ),
+ );
+ }
+}
diff --git a/dev/a11y_assessments/lib/use_cases/use_cases.dart b/dev/a11y_assessments/lib/use_cases/use_cases.dart
new file mode 100644
index 0000000000..139109fa64
--- /dev/null
+++ b/dev/a11y_assessments/lib/use_cases/use_cases.dart
@@ -0,0 +1,19 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/widgets.dart';
+
+import 'check_box_list_tile.dart';
+import 'check_box_list_tile_disabled.dart';
+
+abstract class UseCase {
+ String get name;
+ String get route;
+ Widget build(BuildContext context);
+}
+
+final List useCases = [
+ CheckBoxListTile(),
+ CheckBoxListTileDisabled(),
+];
diff --git a/dev/a11y_assessments/linux/.gitignore b/dev/a11y_assessments/linux/.gitignore
new file mode 100644
index 0000000000..d3896c9844
--- /dev/null
+++ b/dev/a11y_assessments/linux/.gitignore
@@ -0,0 +1 @@
+flutter/ephemeral
diff --git a/dev/a11y_assessments/linux/CMakeLists.txt b/dev/a11y_assessments/linux/CMakeLists.txt
new file mode 100644
index 0000000000..07dc63e380
--- /dev/null
+++ b/dev/a11y_assessments/linux/CMakeLists.txt
@@ -0,0 +1,139 @@
+# Project-level configuration.
+cmake_minimum_required(VERSION 3.10)
+project(runner LANGUAGES CXX)
+
+# The name of the executable created for the application. Change this to change
+# the on-disk name of your application.
+set(BINARY_NAME "a11y_assessments")
+# The unique GTK application identifier for this application. See:
+# https://wiki.gnome.org/HowDoI/ChooseApplicationID
+set(APPLICATION_ID "com.example.a11y_assessments")
+
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
+# versions of CMake.
+cmake_policy(SET CMP0063 NEW)
+
+# Load bundled libraries from the lib/ directory relative to the binary.
+set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
+
+# Root filesystem for cross-building.
+if(FLUTTER_TARGET_PLATFORM_SYSROOT)
+ set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+endif()
+
+# Define build configuration options.
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "Debug" CACHE
+ STRING "Flutter build mode" FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Profile" "Release")
+endif()
+
+# Compilation settings that should be applied to most targets.
+#
+# Be cautious about adding new options here, as plugins use this function by
+# default. In most cases, you should add new options to specific targets instead
+# of modifying this function.
+function(APPLY_STANDARD_SETTINGS TARGET)
+ target_compile_features(${TARGET} PUBLIC cxx_std_14)
+ target_compile_options(${TARGET} PRIVATE -Wall -Werror)
+ target_compile_options(${TARGET} PRIVATE "$<$>:-O3>")
+ target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>")
+endfunction()
+
+# Flutter library and tool build rules.
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+
+add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
+
+# Define the application target. To change its name, change BINARY_NAME above,
+# not the value here, or `flutter run` will no longer work.
+#
+# Any new source files that you add to the application should be added here.
+add_executable(${BINARY_NAME}
+ "main.cc"
+ "my_application.cc"
+ "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+)
+
+# Apply the standard set of build settings. This can be removed for applications
+# that need different build settings.
+apply_standard_settings(${BINARY_NAME})
+
+# Add dependency libraries. Add any application-specific dependencies here.
+target_link_libraries(${BINARY_NAME} PRIVATE flutter)
+target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
+
+# Run the Flutter tool portions of the build. This must not be removed.
+add_dependencies(${BINARY_NAME} flutter_assemble)
+
+# Only the install-generated bundle's copy of the executable will launch
+# correctly, since the resources must in the right relative locations. To avoid
+# people trying to run the unbundled copy, put it in a subdirectory instead of
+# the default top-level location.
+set_target_properties(${BINARY_NAME}
+ PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
+)
+
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# By default, "installing" just makes a relocatable bundle in the build
+# directory.
+set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+# Start with a clean build bundle directory every time.
+install(CODE "
+ file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
+ " COMPONENT Runtime)
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
+ install(FILES "${bundled_library}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endforeach(bundled_library)
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+ file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+ " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+ DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
+ install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endif()
diff --git a/dev/a11y_assessments/linux/flutter/CMakeLists.txt b/dev/a11y_assessments/linux/flutter/CMakeLists.txt
new file mode 100644
index 0000000000..d5bd01648a
--- /dev/null
+++ b/dev/a11y_assessments/linux/flutter/CMakeLists.txt
@@ -0,0 +1,88 @@
+# This file controls Flutter-level build steps. It should not be edited.
+cmake_minimum_required(VERSION 3.10)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+
+# Serves the same purpose as list(TRANSFORM ... PREPEND ...),
+# which isn't available in 3.10.
+function(list_prepend LIST_NAME PREFIX)
+ set(NEW_LIST "")
+ foreach(element ${${LIST_NAME}})
+ list(APPEND NEW_LIST "${PREFIX}${element}")
+ endforeach(element)
+ set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE)
+endfunction()
+
+# === Flutter Library ===
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
+pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
+
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+ "fl_basic_message_channel.h"
+ "fl_binary_codec.h"
+ "fl_binary_messenger.h"
+ "fl_dart_project.h"
+ "fl_engine.h"
+ "fl_json_message_codec.h"
+ "fl_json_method_codec.h"
+ "fl_message_codec.h"
+ "fl_method_call.h"
+ "fl_method_channel.h"
+ "fl_method_codec.h"
+ "fl_method_response.h"
+ "fl_plugin_registrar.h"
+ "fl_plugin_registry.h"
+ "fl_standard_message_codec.h"
+ "fl_standard_method_codec.h"
+ "fl_string_codec.h"
+ "fl_value.h"
+ "fl_view.h"
+ "flutter_linux.h"
+)
+list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+ "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}")
+target_link_libraries(flutter INTERFACE
+ PkgConfig::GTK
+ PkgConfig::GLIB
+ PkgConfig::GIO
+)
+add_dependencies(flutter flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+add_custom_command(
+ OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+ ${CMAKE_CURRENT_BINARY_DIR}/_phony_
+ COMMAND ${CMAKE_COMMAND} -E env
+ ${FLUTTER_TOOL_ENVIRONMENT}
+ "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
+ ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
+ VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+ "${FLUTTER_LIBRARY}"
+ ${FLUTTER_LIBRARY_HEADERS}
+)
diff --git a/dev/a11y_assessments/linux/main.cc b/dev/a11y_assessments/linux/main.cc
new file mode 100644
index 0000000000..281a29e16b
--- /dev/null
+++ b/dev/a11y_assessments/linux/main.cc
@@ -0,0 +1,10 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "my_application.h"
+
+int main(int argc, char** argv) {
+ g_autoptr(MyApplication) app = my_application_new();
+ return g_application_run(G_APPLICATION(app), argc, argv);
+}
diff --git a/dev/a11y_assessments/linux/my_application.cc b/dev/a11y_assessments/linux/my_application.cc
new file mode 100644
index 0000000000..05e5133c60
--- /dev/null
+++ b/dev/a11y_assessments/linux/my_application.cc
@@ -0,0 +1,108 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "my_application.h"
+
+#include
+#ifdef GDK_WINDOWING_X11
+#include
+#endif
+
+#include "flutter/generated_plugin_registrant.h"
+
+struct _MyApplication {
+ GtkApplication parent_instance;
+ char** dart_entrypoint_arguments;
+};
+
+G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
+
+// Implements GApplication::activate.
+static void my_application_activate(GApplication* application) {
+ MyApplication* self = MY_APPLICATION(application);
+ GtkWindow* window =
+ GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
+
+ // Use a header bar when running in GNOME as this is the common style used
+ // by applications and is the setup most users will be using (e.g. Ubuntu
+ // desktop).
+ // If running on X and not using GNOME then just use a traditional title bar
+ // in case the window manager does more exotic layout, e.g. tiling.
+ // If running on Wayland assume the header bar will work (may need changing
+ // if future cases occur).
+ gboolean use_header_bar = TRUE;
+#ifdef GDK_WINDOWING_X11
+ GdkScreen* screen = gtk_window_get_screen(window);
+ if (GDK_IS_X11_SCREEN(screen)) {
+ const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
+ if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
+ use_header_bar = FALSE;
+ }
+ }
+#endif
+ if (use_header_bar) {
+ GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
+ gtk_widget_show(GTK_WIDGET(header_bar));
+ gtk_header_bar_set_title(header_bar, "a11y_assessments");
+ gtk_header_bar_set_show_close_button(header_bar, TRUE);
+ gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
+ } else {
+ gtk_window_set_title(window, "a11y_assessments");
+ }
+
+ gtk_window_set_default_size(window, 1280, 720);
+ gtk_widget_show(GTK_WIDGET(window));
+
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
+
+ FlView* view = fl_view_new(project);
+ gtk_widget_show(GTK_WIDGET(view));
+ gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
+
+ fl_register_plugins(FL_PLUGIN_REGISTRY(view));
+
+ gtk_widget_grab_focus(GTK_WIDGET(view));
+}
+
+// Implements GApplication::local_command_line.
+static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
+ MyApplication* self = MY_APPLICATION(application);
+ // Strip out the first argument as it is the binary name.
+ self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
+
+ g_autoptr(GError) error = nullptr;
+ if (!g_application_register(application, nullptr, &error)) {
+ g_warning("Failed to register: %s", error->message);
+ *exit_status = 1;
+ return TRUE;
+ }
+
+ g_application_activate(application);
+ *exit_status = 0;
+
+ return TRUE;
+}
+
+// Implements GObject::dispose.
+static void my_application_dispose(GObject* object) {
+ MyApplication* self = MY_APPLICATION(object);
+ g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
+ G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
+}
+
+static void my_application_class_init(MyApplicationClass* klass) {
+ G_APPLICATION_CLASS(klass)->activate = my_application_activate;
+ G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
+ G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
+}
+
+static void my_application_init(MyApplication* self) {}
+
+MyApplication* my_application_new() {
+ return MY_APPLICATION(g_object_new(my_application_get_type(),
+ "application-id", APPLICATION_ID,
+ "flags", G_APPLICATION_NON_UNIQUE,
+ nullptr));
+}
diff --git a/dev/a11y_assessments/linux/my_application.h b/dev/a11y_assessments/linux/my_application.h
new file mode 100644
index 0000000000..8c66ec4854
--- /dev/null
+++ b/dev/a11y_assessments/linux/my_application.h
@@ -0,0 +1,22 @@
+// Copyright 2014 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef FLUTTER_MY_APPLICATION_H_
+#define FLUTTER_MY_APPLICATION_H_
+
+#include
+
+G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
+ GtkApplication)
+
+/**
+ * my_application_new:
+ *
+ * Creates a new Flutter-based application.
+ *
+ * Returns: a new #MyApplication.
+ */
+MyApplication* my_application_new();
+
+#endif // FLUTTER_MY_APPLICATION_H_
diff --git a/dev/a11y_assessments/macos/.gitignore b/dev/a11y_assessments/macos/.gitignore
new file mode 100644
index 0000000000..746adbb6b9
--- /dev/null
+++ b/dev/a11y_assessments/macos/.gitignore
@@ -0,0 +1,7 @@
+# Flutter-related
+**/Flutter/ephemeral/
+**/Pods/
+
+# Xcode-related
+**/dgph
+**/xcuserdata/
diff --git a/dev/a11y_assessments/macos/Flutter/Flutter-Debug.xcconfig b/dev/a11y_assessments/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 0000000000..c2efd0b608
--- /dev/null
+++ b/dev/a11y_assessments/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/dev/a11y_assessments/macos/Flutter/Flutter-Release.xcconfig b/dev/a11y_assessments/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 0000000000..c2efd0b608
--- /dev/null
+++ b/dev/a11y_assessments/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1 @@
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/dev/a11y_assessments/macos/Runner.xcodeproj/project.pbxproj b/dev/a11y_assessments/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000000..1da16b798e
--- /dev/null
+++ b/dev/a11y_assessments/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,695 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+ buildPhases = (
+ 33CC111E2044C6BF0003C045 /* ShellScript */,
+ );
+ dependencies = (
+ );
+ name = "Flutter Assemble";
+ productName = FLX;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC10EC2044A3C60003C045;
+ remoteInfo = Runner;
+ };
+ 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+ remoteInfo = FLX;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 33CC110E2044A8840003C045 /* Bundle Framework */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Bundle Framework";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; };
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; };
+ 33CC10ED2044A3C60003C045 /* a11y_assessments.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "a11y_assessments.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; };
+ 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "