Developing Chrome for iOS with the Xcode IDE

This document contains notes used during a presentation about how to use Xcode to develop Chrome for iOS.

Background

.xcworkspace and .xcodeproj

  • Open all.xcworkspace only.
  • Generated from BUILD.gn files.
  • Don't make changes to it as it is a “fake” representation of the project
    • changes will not be committed
    • changes will be overwritten without warning
  • Modify BUILD files instead
  • Added BUILD.gn files/source_sets need to be referenced from other ones as a dep in order for it to be shown in xcode.

Warning: do not open the .xcodeproj as this file does not configure the “Legacy Build System”. If you do open this file, many things won‘t work properly (clicking on an error won’t open the corresponding file, ...).

Adding new files

  • Create new files with tools/boilerplate.py
  • Add files to BUILD.gn mate ios/chrome/...BUILD.gn
  • Add new source_set target as a dep of another target
  • Execute gclient runhooks or gclient sync

Simulators

  • Simulators build for Mac architecture, not emulators. Fast, generally good for most development
  • To run on device, need provisioning profiles and certificate

Xcode

  • Project location is src/out/build/, open all.workspace
  • Choose “Automatically generate targets” after a gclient sync
  • Start typing while dropdowns are presented to filter the displayed items

Targets

  • `chrome' is the main application target
  • ios_web_shell and ios_web_view_shell test lower level of application

Tests

  • Unittests/Inttests

    • Add flags to specify tests to run (Option-Click on unittest target name, select Run from left panel, add to “Arguments Passed on Launch”)
    • gtest_filter=TestClass.*
    • gtest_repeat=20
    • Full list of options available by sending an unknown option
  • EarlGrey

    • EG1 deprecated
    • EG2 are current UI tests
      • A separate “test” process communicates with “the app”.
      • EDO is term for “distant object” on “the other side”.
      • egtest files can run under both EG1 and EG2 with correct setup in BUILD.gn because the layer of helpers encapsulate the necessary differences.