Build Chromium for iOS Device

3,104 views
Skip to first unread message

Tuấn Trần

unread,
Apr 15, 2016, 4:36:42 AM4/15/16
to Chromium-dev
Hi,
I have built and run Chromium on iOS Simulator from Chromium source code (I have used ninja to build). I also have built successfully Chromium for iOS Device but I can't install it on my iPad!
I have used ninja to build with command line:
ninja -C out/Debug-iphoneos All
I have used  libimobiledevice library (http://www.libimobiledevice.org/) to install app to my iPad by command line:
sudo ideviceinstaller -i /out/Debug-iphoneos/ios_web_shell.app
=> I get an error 
ERROR: Install failed. Got error "ApplicationVerificationFailed" with code 0xe800801c: Failed to verify code signature of /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.H2pIOH/extracted/ios_web_shell.app : 0xe800801c (No code signature found.)
=> Can you help me fix it? What need to do before build Chromium source for iOS Device with ninja?
Thanks!


Sylvain Defresne

unread,
Apr 17, 2016, 7:04:46 AM4/17/16
to Tuấn Trần, Chromium-dev
You need to be able to digitally code sign the application.

So you need to configure Xcode to be able to code sign iOS applications (see Apple documentation on how to set this up). You may have to edit ios/web/shell/Info.plist to change the CFBundleExecutable prefix to something corresponding to your signing identity.

You can check whether you're set up will be recognized by out tools by running the following command:

$ security find-identity -p codesigning -v
  1) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "iPhone Developer: XXXX (XXXXXXXXXXX)"
     1 valid identities found

If you see at least one "iPhone Developer: ..." then you should be good to go. Then run "gclient runhooks" again and rebuild.

I personally have never tested libimobiledevice to install the app on an iOS device so cannot guarantee that it will work. I usually install the app from within Xcode (either by using drag-n-drop or by using hybrid build mode).
-- Sylvain

--
--
Chromium Developers mailing list: chromi...@chromium.org
View archives, change email options, or unsubscribe:
http://groups.google.com/a/chromium.org/group/chromium-dev

Tuấn Trần

unread,
Apr 18, 2016, 12:22:54 PM4/18/16
to Chromium-dev, trananht...@gmail.com
Hi, Thanks for response!
I will try it! I have a question on XCode plz help me: How to I config Chromium Xcode project for the armv7 architecture?

Vào 18:04:46 UTC+7 Chủ Nhật, ngày 17 tháng 4 năm 2016, Sylvain Defresne đã viết:

Thiago Farina

unread,
Apr 18, 2016, 12:49:00 PM4/18/16
to Tuấn Trần, Chromium-dev
On Mon, Apr 18, 2016 at 1:22 PM, Tuấn Trần <trananht...@gmail.com> wrote:
Hi, Thanks for response!
I will try it! I have a question on XCode plz help me: How to I config Chromium Xcode project for the armv7 architecture?

Please, try not top-post when replying. And also remove unnecessary parts of the e-mail.

This is a technical mailing list, not a support forum. :)

Did you try setting target_arch=arm?

If you are using GYP, you can set that on GYP_DEFINES, if you are using GN you can put it in args.gn file,
or when calling `gn gen --args=''`. But it is hard to point you to a direction without knowing how you have set
up your build.

The more precisely you provide information about what you did and what went wrong, the more likely
we will be able to help you.

-- 
Thiago Farina

Thiago Farina

unread,
Apr 18, 2016, 12:57:11 PM4/18/16
to Tuấn Trần, Chromium-dev
On Mon, Apr 18, 2016 at 1:48 PM, Thiago Farina <tfa...@chromium.org> wrote:


On Mon, Apr 18, 2016 at 1:22 PM, Tuấn Trần <trananht...@gmail.com> wrote:
Hi, Thanks for response!
I will try it! I have a question on XCode plz help me: How to I config Chromium Xcode project for the armv7 architecture?

OK, so went to look at this a little further, because I was curious.

So in GYP it is called target_arch, in GN it is target_cpu [1].

I believe if you set it, then arm_version will be set automatically to version 7 for you [2], at least in GN.
GYP will probably do the same as well.

Hope that helps,



--
Thiago Farina

Sylvain Defresne

unread,
Apr 18, 2016, 1:02:46 PM4/18/16
to Thiago Farina, Tuấn Trần, Chromium-dev
While target_arch exists with gyp it does not currently work when targeting iOS, instead you have to left target_arch unset and use target_subarch. The supported values are "arm32" (for targeting "armv7"), "arm64" (for targetting "aarch64") and "both" (to build a fat binary that will support both "armv7" and "arm64").

With gn the configuration is saner, and you just have to set target_cpu to one of "arm", "armv7" or "arm64" ("arm" is another name of "armv7").

Please note that with gn, code signing is not implemented and you'll have to manually code sign the generated binary.
-- Sylvain

--

Tuấn Trần

unread,
Apr 19, 2016, 12:32:51 AM4/19/16
to Chromium-dev, trananht...@gmail.com
Thanks Thiago! :)

Vào 23:49:00 UTC+7 Thứ Hai, ngày 18 tháng 4 năm 2016, Thiago Farina đã viết:

Tuấn Trần

unread,
Apr 19, 2016, 12:41:44 AM4/19/16
to Chromium-dev
Thanks!
Finally I have ran Chromium on my iPad! But It don't look like Google Chrome on iOS! My chromium look like UIWebview (+ toolbar), it don't have newtab, chrome://version or chrome://history,... So, I wonder May be I have got old version of Chromium? OR currently Chromium that's it!


Vào 15:36:42 UTC+7 Thứ Sáu, ngày 15 tháng 4 năm 2016, Tuấn Trần đã viết:

Tuấn Trần

unread,
Apr 19, 2016, 12:42:40 AM4/19/16
to Chromium-dev, tfa...@chromium.org, trananht...@gmail.com
Thanks Sylvain!

Vào 00:02:46 UTC+7 Thứ Ba, ngày 19 tháng 4 năm 2016, Sylvain Defresne đã viết:

Stuart Morgan

unread,
Apr 19, 2016, 11:10:58 AM4/19/16
to trananht...@gmail.com, Chromium-dev
See the first pagraph (especially the bolded part) of:

You keep referring to having built and run Chromium, but there's currently no such target for iOS. What you've built is ios_web_shell, the analog of content_shell on other platforms.

-Stuart


Tuấn Trần

unread,
Apr 19, 2016, 11:55:26 AM4/19/16
to Chromium-dev, trananht...@gmail.com
Hi, 
Thanks for your answer!
Yes, I see! Currently, it is a minimal wrapper around the web layer. 
BTW, I want to know this ios_web_shell can run alert() Javascript function? Because I have tried run this web http://www.w3schools.com/js/tryit.asp?filename=tryjs_alert on my ios_web_shell.app but when I click on button Try it on this web, it's nothing! Nothing alert! 

Vào 22:10:58 UTC+7 Thứ Ba, ngày 19 tháng 4 năm 2016, Stuart Morgan đã viết:

Stuart Morgan

unread,
Apr 20, 2016, 12:47:11 PM4/20/16
to trananht...@gmail.com, Chromium-dev
On Tue, Apr 19, 2016 at 8:55 AM Tuấn Trần <trananht...@gmail.com> wrote:
Yes, I see! Currently, it is a minimal wrapper around the web layer. 

Being a minimal wrapper around the web layer is the entire point of ios_web_shell, so you should not expect that to change.
 
BTW, I want to know this ios_web_shell can run alert() Javascript function? Because I have tried run this web http://www.w3schools.com/js/tryit.asp?filename=tryjs_alert on my ios_web_shell.app but when I click on button Try it on this web, it's nothing! Nothing alert! 

Many of the delegate calls from the web layer to the embedder (CRWWebUserInterfaceDelegate in this case) are not currently implemented in ios_web_shell.

-Stuart  

Tuấn Trần

unread,
Apr 20, 2016, 1:46:54 PM4/20/16
to Chromium-dev, trananht...@gmail.com
Hi, Thanks for answer!
Can you tutorial me call function in ios/web/web_sate/web_state_impl.mm from Javascript?

Vào 23:47:11 UTC+7 Thứ Tư, ngày 20 tháng 4 năm 2016, Stuart Morgan đã viết:

Nguyễn Mạnh Tuấn

unread,
Jun 7, 2016, 4:01:28 AM6/7/16
to Chromium-dev
Hi ! Mình đang quan tâm đến phần này cũng mới build được trên simulator, bạn build trên real device bằng cách nào thế ???

Gang

unread,
Feb 16, 2017, 9:03:25 PM2/16/17
to Chromium-dev, trananht...@gmail.com
Hi,I want to konw how to buiid chromium for ios , can you tell me detailed.Thanks!

在 2016年4月17日星期日 UTC+8下午7:04:46,Sylvain Defresne写道:

Jason Liu

unread,
Feb 16, 2017, 9:20:27 PM2/16/17
to zhaoga...@gmail.com, Chromium-dev, trananht...@gmail.com
Hi,


Let us know if you have any questions.

Best,
Jason

葛光乐

unread,
Feb 17, 2017, 4:00:36 AM2/17/17
to jaso...@chromium.org, zhaoga...@gmail.com, Chromium-dev, trananht...@gmail.com
By the instructions we can only run  it on simulator, when on device  will encounter issue about signing identity.

I change all the signing use mine in the Xcode setting, but failed still.

How to change the "CFBundleExecutable prefix" @sylvain

Thank you!

Best,
leoge

-- from guangle.ge

You received this message because you are subscribed to the Google Groups "Chromium-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to chromium-dev+unsubscribe@chromium.org.

Jason Liu

unread,
Feb 17, 2017, 10:40:13 AM2/17/17
to 葛光乐, Sylvain Defresne, zhaoga...@gmail.com, Chromium-dev, Tuấn Trần
+sdefresne

Sylvain Defresne

unread,
Feb 17, 2017, 10:48:33 AM2/17/17
to Jason Liu, 葛光乐, zhaoga...@gmail.com, Chromium-dev, Tuấn Trần
You can use the ios_app_bundle_id_prefix gn variable to control the prefix CFBundleExecutable prefix. The identity is auto-detected if possible but can be controlled by the ios_code_signing_identity gn variable.

For example,

ios_app_bundle_id_prefix = "com.example"
ios_code_singing_identity = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

Note that the generated project does not supports automatic code signing with Xcode, so you need to have proper code signing identity and provisioning profile for the selected CFBundleExecutable prefix installed on your computer.
-- Sylvain

葛光乐

unread,
Feb 18, 2017, 3:45:06 AM2/18/17
to Sylvain Defresne, Jason Liu, zhaoga...@gmail.com, Chromium-dev, Tuấn Trần
@Sylvain Defresne, Thank you very much!

Now I can get through code signing phase. But I can not install it to device,the error is,


So I change the bundle identifier in Xcode for target chrome(src/ios/web/shell/Info.plist)、share_extension(src/ios/chrome/share_extension/Info.plist)、today_extension(src/ios/chrome/today_extension/Info.plist) with leoge.Chromium、leoge.Chromium.share、leoge.Chromium.today.


Then the error changes to


And the diff as follow:





How to do next?

Best,
leoge

Sylvain Defresne

unread,
Feb 20, 2017, 6:09:43 AM2/20/17
to 葛光乐, Jason Liu, zhaoga...@gmail.com, Chromium-dev, Tuấn Trần
You should be able to build with a custom CFBundleIndentifierPrefix, provisioning profiles and code signing identity without making any changes to the code just by setting the correct variables using "gn args" (or by editing ~/.setup-gn file if you use ios/build/tools/setup-gn.py).

To build Chromium with the identifier and code signature you used in your screenshots, you should only have to do (note there are two commands, each a single line):

$ gn gen --args='target_os="ios" target_cpu="arm64" additional_target_cpus=["arm"] ios_code_signing_identity="guangle le" ios_app_bundle_id_prefix="leoge.chromium"' out/Default
$ ninja -C out/Default chrome

Your mobile provisioning profile should allow you to have application extension (so probably three separate mobile provisioning profile). If you do not want the application extension, you can add ios_enable_today_extension=false and ios_enable_share_extension=false variable when running "gn gen".

Everytime you change ios_code_signing_identity, ios_app_bundle_id_prefix, ios_enable_today_extension or ios_enable_share_extension, you need to rebuild the application. You can either build from scratch by running "gn clean out/Default" and then running ninja, or just delete the application bundles by running "rm -rf out/Default/*.app" (this will probably be faster). The reason you need to do clean build in those situations is that the extension and code signature are embedded in the application bundle and there is no way to remove them as part of the build.
-- Sylvain

Gang Zhao

unread,
Feb 20, 2017, 10:46:44 PM2/20/17
to Chromium-dev
Hi,By the instructions I can only run  it on simulator, how to run it on device ,can you tell me detailed.thanks!

{Error Domain=NSPOSIXErrorDomain Code=13 "Permission denied"}

葛光乐

unread,
Feb 21, 2017, 4:05:20 AM2/21/17
to Sylvain Defresne, Jason Liu, zhaoga...@gmail.com, Chromium-dev, Tuấn Trần
@Sylvain Defresne Thank you very much for your advice!

Clear the directory and follow your steps to compile successfully.

Then I open Xcode, run it on device, failed with the dialog as follow:

内嵌图片 1


Best,
leoge

Sylvain Defresne

unread,
Feb 21, 2017, 12:08:28 PM2/21/17
to 葛光乐, Jason Liu, zhaoga...@gmail.com, Chromium-dev, Tuấn Trần
Thank you for your patience. I think this is likely because we incorrectly request the com.apple.developer.associated-domains entitlement when building Chromium (should only be requested when building Chrome). I did not have the time to investigate more today so I cannot give you instruction on how to bypass this error sorry.

I'll try to fix the build and improve the documentation to explain what is required and how to proceed to build Chromium on iOS for device. You can follow issue https://bugs.chromium.org/p/chromium/issues/detail?id=694604 to track progress.

Regards,
-- Sylvain

葛光乐

unread,
Feb 22, 2017, 12:45:06 AM2/22/17
to Sylvain Defresne, Jason Liu, zhaoga...@gmail.com, Chromium-dev, Tuấn Trần
@Sylvain Defresne Thank you again!

To be  honest, it is out of me. I have followed the issue,  wait for the good news.

Best,
leoge

Sylvain Defresne

unread,
Feb 23, 2017, 12:25:40 PM2/23/17
to 葛光乐, Jason Liu, zhaoga...@gmail.com, Chromium-dev, Tuấn Trần
[Reposting from the correct account].

I've landed the documentation update and a few CLs to remove the associated domain and reduce the number of different mobile provisioning profile required to build and run the tests.

The instruction on which mobile provisioning profile and the capabilites they require should now be explained in the documentation at https://chromium.googlesource.com/chromium/src.git/+/master/docs/ios_build_instructions.md#Building-for-device

In your case, I think you need to add the "App Groups" capability to your mobile provisioning profile for the group named "group.leoge.chromium.chrome". Then you'll have to delete the app and the extensions (rm -rf out/Default/*.app*) and rebuild chrome target.
-- Sylvain

Darius Miliauskas

unread,
Jul 10, 2018, 10:45:00 AM7/10/18
to Chromium-dev
After several days I found that in my case there were the issues with provisioning profiles which were actually automatically generated by XCode.  Only logout from the account in XCode (XCode>Preferences>Accounts), and deleting all provisioning profiles from Mac solved the issue. Between, ninja (trying to build via Terminal) took the provisioning profiles generated by XCode since they are  located in the pc:  ~Library/MobileDevice/Provisioning Profiles.

Darius Miliauskas

unread,
Jul 10, 2018, 10:49:44 AM7/10/18
to Chromium-dev
Between, I followed all the instructions given at: https://chromium.googlesource.com/chromium/src/+/master/docs/ios/build_instructions.md as well as tried build via ninja or XCode, it did not help at all. The builds were successful, but it was impossible to write to the device.

vipin...@gmail.com

unread,
Aug 22, 2018, 8:51:28 PM8/22/18
to Chromium-dev


On Friday, April 15, 2016 at 2:06:42 PM UTC+5:30, Tuấn Trần wrote:
Hi,
I have built and run Chromium on iOS Simulator from Chromium source code (I have used ninja to build). I also have built successfully Chromium for iOS Device but I can't install it on my iPad!
I have used ninja to build with command line:
ninja -C out/Debug-iphoneos All
I have used  libimobiledevice library (http://www.libimobiledevice.org/) to install app to my iPad by command line:
sudo ideviceinstaller -i /out/Debug-iphoneos/ios_web_shell.app
=> I get an error 
ERROR: Install failed. Got error "ApplicationVerificationFailed" with code 0xe800801c: Failed to verify code signature of /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.H2pIOH/extracted/ios_web_shell.app : 0xe800801c (No code signature found.)
=> Can you help me fix it? What need to do before build Chromium source for iOS Device with ninja?
Thanks!

 It is working on my side . Nothing to do. Just open all.xcworkspace and select target and schema "ios_web_shell". Then tap on general tab and choose info.plist from web_shell_folder which will be shown. Then run it on device or ipad.

But I am also facing problem when I am trying to deploy "Chromium.app" on device. Xcode shows error "The executable file was signed with invalid entitlements" 

=> Can you help me fix it? What I need to do build chromium.app on iOS device.

Thanks in advance

Olivier Robin

unread,
Aug 23, 2018, 3:12:50 AM8/23/18
to Chromium-dev
You can run
codesign -d  --entitlements :-  Chromium 

in the Chromium.app to see the needed entitlements.
Make sure your mobile provisions provide everything.

vipin...@gmail.com

unread,
Aug 23, 2018, 5:39:25 AM8/23/18
to Chromium-dev
 But how to change the bundle name.  Is it necessary to create all extension certificate? 

Olivier Robin

unread,
Aug 23, 2018, 5:47:57 AM8/23/18
to Chromium-dev
You can change chromium_bundle_id in build/chrome_build.gni
and ios_app_bundle_id_prefix in build/config/ios/ios_sdk.gni

You can disable the compilation of extensions if you don't want them.
Just set ios_enable_search_widget_extension, ios_enable_content_widget_extension, ios_enable_share_extension to false.

vipin...@gmail.com

unread,
Aug 23, 2018, 6:40:18 AM8/23/18
to Chromium-dev
Thank and appreciate you for response ,

I have done all these things. But still getting error "The executable file was signed with invalid entitlements".

I have created only provisioning certificate with respect to bundle identifier : "com.XXXXXXXXX" 

Thanks again !!!!!

Olivier Robin

unread,
Aug 23, 2018, 7:46:09 AM8/23/18
to Chromium-dev
You mobileprovisions must cover all requested entitlements (app group,...)

vipin...@gmail.com

unread,
Aug 23, 2018, 8:07:12 AM8/23/18
to Chromium-dev
All requested entitlements means:
group.{prefix}.chrome and group.{prefix}.common associate with bundle identifier.

Am I right or not ?

Procees to creation of mobileprovisions:

> First I have created mobileprovision.
> Create app group group.{prefix}.chrome and group.{prefix}.common
> AppId is assigned with these groups. 

Olivier Robin

unread,
Aug 23, 2018, 8:18:39 AM8/23/18
to vipin...@gmail.com, Chromium-dev
You must provide everything that is required by the entitlements.

--
--
Chromium Developers mailing list: chromi...@chromium.org
View archives, change email options, or unsubscribe:
http://groups.google.com/a/chromium.org/group/chromium-dev
---
You received this message because you are subscribed to the Google Groups "Chromium-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to chromium-dev...@chromium.org.
To view this discussion on the web visit https://groups.google.com/a/chromium.org/d/msgid/chromium-dev/d47b6150-54e3-4dbf-8f27-94dcea56bce0%40chromium.org.

Olivier Robin

unread,
Aug 23, 2018, 8:18:59 AM8/23/18
to vipin...@gmail.com, Chromium-dev
When you install the bundle, you can check in the device console what is missing in the provided mobile provision.

vipin...@gmail.com

unread,
Aug 23, 2018, 8:20:04 AM8/23/18
to Chromium-dev
Can you suggest me how to deploy Chromium.app on device in breif and step-wise?

It will be helpful for me.

Thanks in advance

Olivier Robin

unread,
Aug 23, 2018, 8:24:20 AM8/23/18
to vipin...@gmail.com, Chromium-dev
in xcode, open the device screen (command + shift + 2) and drop the Chromium.app in the device application list. 

--
--
Chromium Developers mailing list: chromi...@chromium.org
View archives, change email options, or unsubscribe:
http://groups.google.com/a/chromium.org/group/chromium-dev
---
You received this message because you are subscribed to the Google Groups "Chromium-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to chromium-dev...@chromium.org.

vipin...@gmail.com

unread,
Aug 23, 2018, 8:56:07 AM8/23/18
to Chromium-dev, vipin...@gmail.com
Thanks,

I found error: 

<private> XPC Entitlement Failed: 'public-signal-strength' entitlement required for <private>; dropping.


Can you suggest me. 

Olivier Robin

unread,
Aug 23, 2018, 9:04:26 AM8/23/18
to vipin...@gmail.com, Chromium-dev
This is likely not a chrome log

vipin...@gmail.com

unread,
Aug 23, 2018, 9:15:44 AM8/23/18
to Chromium-dev, vipin...@gmail.com
Sorry for disturbing,

If you have done.
Can you describe the process, "how to run on device" from initial ?

I would be very thankful.

Olivier Robin

unread,
Aug 23, 2018, 12:54:05 PM8/23/18
to vipin...@gmail.com, Chromium-dev
The easiest way to do this would be to use xcode automatic mobileprovisions generations.

1. disable any ios_enable_XXX_extension in ios/build/chrome_build.gni (it would make things more difficult).
2. update the group prefix in build/config/ios/ios_sdk.gni
3. generate xcode project by running : python ios/build/tools/setup-gn.py 
4. build : ninja -C out/Debug-iphoneos chrome
5. open the project out/build/all.xcworkspace in xcode
6. in the chrome project settings, enable "automatically manage signing" and select your certificate
7. in Build Settings, set the Info.plist path for debug to point to out/Debug-iphoneos/Chromium.app/Info.plist
8. press run for the chrome project
9. enjoy

vipin...@gmail.com

unread,
Aug 24, 2018, 1:49:18 AM8/24/18
to Chromium-dev, vipin...@gmail.com
Thank you very much for guiding.

I am working on that as per your given step

Thanks again..

vipin...@gmail.com

unread,
Aug 24, 2018, 6:05:30 AM8/24/18
to Chromium-dev, vipin...@gmail.com
When I choose Info.plist in General :
Xcode display:

Display Name : ${CHROMIUM_SHORT_NAME}
Bundle Identifier : .(dot)         // I do'nt know why? But should be "org.chromium.chrome.ios.herebedragons"

Why?

Sylvain Defresne

unread,
Aug 24, 2018, 6:19:30 AM8/24/18
to vipin...@gmail.com, chromi...@chromium.org
What is the content of your args.gn file?
-- Sylvain

vipin...@gmail.com

unread,
Aug 24, 2018, 6:24:56 AM8/24/18
to Chromium-dev, vipin...@gmail.com
args.gn file contain:

is_debug = true
enable_dsyms = false
enable_stripping = enable_dsyms
is_official_build = false
is_chrome_branded = is_official_build
use_xcode_clang = is_official_build
use_clang_coverage = false
is_component_build = false
target_cpu = "arm64"
target_os = "ios"

vipin...@gmail.com

unread,
Aug 24, 2018, 8:27:34 AM8/24/18
to Chromium-dev, vipin...@gmail.com
Thanks a lot.
Now it's working on device.

I want to know about SSL communication.
How to communicate SSL with chromium in iOS.

gopimanojkumar a

unread,
Jan 7, 2020, 1:25:41 PM1/7/20
to Chromium-dev
I am new to Chromium and I am trying to implement and build chromium for iOS (iPad & iPhone), Can you please guide me on this how to proceed it by step by step procedure

Mohamed Heikal

unread,
Jan 7, 2020, 4:39:11 PM1/7/20
to agopima...@gmail.com, Chromium-dev

--
--
Chromium Developers mailing list: chromi...@chromium.org
View archives, change email options, or unsubscribe:
http://groups.google.com/a/chromium.org/group/chromium-dev
---
You received this message because you are subscribed to the Google Groups "Chromium-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to chromium-dev...@chromium.org.
Reply all
Reply to author
Forward
0 new messages