Gecko-dev Diary
Starting in August 2023 I'll be upgrading the Sailfish OS browser from Gecko version ESR 78 to ESR 91. This page catalogues my progress.
Latest code changes are in the gecko-dev sailfishos-esr91 branch.
There is an index of all posts in case you want to jump to a particular day.
Gecko
5 most recent items
1 Sep 2023 : Day 16 #
Yesterday we fixed a problem causing the MOC to fail building, as well as refactoring some functions that had been renamed upstream. This morning I was happy to see that the build moved forwards beyond those errors. So today we're on to something new. Here's what we're dealing with:
So right now the headers aren't available, but they may be available in the future.
Looking through the header files for newer kernels I can see the value needed seems to be architecture-specific, but we're only interested in the aarch64 variant (because all of this code is gated with an __aarch64 define, so I'm wondering whether I can just get away with defining it.
This might be a really bad idea. On the other hand, looking through the code, there doesn't seem any way around it short of reverting the entire upstream commit. Adding the value in will allow the code to compile, but could cause havoc at run time in case I choose the wrong value and end up calling a random syscall.
However, mal also helpfully pointed out that there are kernel headers for Linux 5.4 available; apparently these are needed for some native Sailfish OS builds. Would these be safe to use?
For now I'm just going to define the value, since (assuming I've got the right one) this should also be safe for the same reasons. I'll shift to moving the newer headers in due course.
I shouldn't forget to do this, because I can make the situation clear in the commit/patch that I create. So I'm going to add the value in and maybe, just maybe, the newer linux headers will be introduced in a future SDK release. Thanks go to mal for helping with this. Thankfully the changes get the build to move on again.
Next we have another NS_LITERAL_STRING error similar to that we saw on Day 10.
Having worked through all these cases the build gets another step further. Next we have the following:
We're left with a whole slew of errors. I've cut out most of them for brevity, but also because we're not going to be able to fix them all today: most we'll have to come back to tomorrow.
But the errors are actually really important: they're the most significant upstream change we've yet hit, and they deserve inclusion in full. But we'll come to that in due course. Here, at any rate, are the first few errors:
Starting from the top, the first problem is that the CompositorBridgeParent class is marked as final. Final classes are supposed to be classes that can't be inherited from; none of their constituent parts can be overridden. But EmbedLite wants EmbedLiteCompositorBridgeParent to subclass it.
This turns out not to be new, and there's already a patch 0018 with the title "Make it possible to extend CompositorBridgeParent" that removes the final annotation to allow this to happen.
The patch is really simple, just removing the final annotation from the class, and it applies without the need for any manual teasing. Nice! At least some of the other errors in the output above could well be caused by this one small change, although it's not clear that this will cover all of them. But the easiest way to clear this question up is to run the build again.
153:38.02 In file included from Unified_cpp_js_src_jit14.cpp:47: 153:38.02 ${PROJECT}/gecko-dev/js/src/jit/arm64/vixl/MozCpu-vixl.cpp: In function ‘int membarrier( ’ was not declared in this scope 153:38.02 return syscall(__NR_membarrier, cmd, flags); 153:38.02 ^~~~~~~~~~~~~~~ 153:38.03 ${PROJECT}/gecko-dev/js/src/jit/arm64/vixl/MozCpu-vixl.cpp:52:20: note: suggested alternative: ‘membarrier’ 153:38.03 return syscall(__NR_membarrier, cmd, flags); 153:38.03 ^~~~~~~~~~~~~~~ 153:38.03 membarrierThe __NR_membarrier define comes from unistd.h with a value that's processor-specific. There's no mention of it in the header in the SDK, but a quick search on the Web makes the reason clear: the value was introduced in kernel version 4.3. Sailfish OS runs various different kernel versions; the one on my Xperia 10 III is 4.19:
[defaultuser@kolbe ~]$ uname -a Linux kolbe 4.19.248 #1 SMP PREEMPT Fri Jul 7 13:17:23 UTC 2023 aarch64 GNU/LinuxHowever, the latest headers available in the SDK are for Linux kernel 3.18. Curious to know why, I asked mal on IRC:
<flypig> mal: what's the reason Sailfish uses kernel headers 3.18 as opposed to something newer?
<mal> flypig: there was some talk about headers, we need to test that having newer headers won't enable some new things in some packages which would break devices with older kernels
<mal> I probably should do a test build of devel with new headers to see what happens
<flypig> mal: if you were to bump up the headers, what's the latest version you're likely to be able to increase them to?
<mal> preferrably at least 4.4 but I would like to go to even 5.4 or newer if possible
<mal> some LTS version
<mal> it really depends on what works
<mal> flypig: there was some talk about headers, we need to test that having newer headers won't enable some new things in some packages which would break devices with older kernels
<mal> I probably should do a test build of devel with new headers to see what happens
<flypig> mal: if you were to bump up the headers, what's the latest version you're likely to be able to increase them to?
<mal> preferrably at least 4.4 but I would like to go to even 5.4 or newer if possible
<mal> some LTS version
<mal> it really depends on what works
So right now the headers aren't available, but they may be available in the future.
Looking through the header files for newer kernels I can see the value needed seems to be architecture-specific, but we're only interested in the aarch64 variant (because all of this code is gated with an __aarch64 define, so I'm wondering whether I can just get away with defining it.
This might be a really bad idea. On the other hand, looking through the code, there doesn't seem any way around it short of reverting the entire upstream commit. Adding the value in will allow the code to compile, but could cause havoc at run time in case I choose the wrong value and end up calling a random syscall.
However, mal also helpfully pointed out that there are kernel headers for Linux 5.4 available; apparently these are needed for some native Sailfish OS builds. Would these be safe to use?
<mal> flypig: looking at the diff in that it checks for the kernel version at runtime
<flypig> mal: so you think would therefore be safe?
<mal> yes, I think it should be ok
<mal> for that case0
<flypig> mal: so you think would therefore be safe?
<mal> yes, I think it should be ok
<mal> for that case0
For now I'm just going to define the value, since (assuming I've got the right one) this should also be safe for the same reasons. I'll shift to moving the newer headers in due course.
I shouldn't forget to do this, because I can make the situation clear in the commit/patch that I create. So I'm going to add the value in and maybe, just maybe, the newer linux headers will be introduced in a future SDK release. Thanks go to mal for helping with this. Thankfully the changes get the build to move on again.
Next we have another NS_LITERAL_STRING error similar to that we saw on Day 10.
190:14.47 mobile/sailfishos/components 190:18.48 ${PROJECT}/gecko-dev/mobile/sailfishos/components/nsClipboard.cpp: In member function ‘virtual nsresult nsEmbedClipboard::SetData( nsITransferable*, nsIClipboardOwner*, int32_t)’: 190:18.48 ${PROJECT}/gecko-dev/mobile/sailfishos/components/nsClipboard.cpp:64:30: error: ‘NS_LITERAL_STRING’ was not declared in this scope 190:18.48 root->SetPropertyAsAString(NS_LITERAL_STRING("data"), buffer); 190:18.48 ^~~~~~~~~~~~~~~~~ 190:18.49 ${PROJECT}/gecko-dev/mobile/sailfishos/components/nsClipboard.cpp:64:30: note: suggested alternative: ‘NS_EXTERNAL_VIS’ 190:18.49 root->SetPropertyAsAString(NS_LITERAL_STRING("data"), buffer); 190:18.49 ^~~~~~~~~~~~~~~~~ 190:18.49 NS_EXTERNAL_VISThere is a difference this time though: this is NS_LITERAL_STRING whereas then it was NS_LITERAL_CSTRING (note the extra "C"). It's because of that extra letter that my checks for other instances didn't throw anything up previously. But the fix is the same: we can simply change all these to either wrap them with u..._ns in the case of string literals, or using the nsLiteralString constructor otherwise (note again the slight change: last time it was nsLiteralCString with an extra "C").
Having worked through all these cases the build gets another step further. Next we have the following:
184:35.72 mobile/sailfishos/components 184:39.33 ${PROJECT}/gecko-dev/mobile/sailfishos/components/nsClipboard.cpp: In member function ‘virtual nsresult nsEmbedClipboard::GetData( nsITransferable*, int32_t)’: 184:39.34 ${PROJECT}/gecko-dev/mobile/sailfishos/components/nsClipboard.cpp:90:16: error: invalid use of incomplete type ‘class nsIThread’ 184:39.34 rv = thread->ProcessNextEvent(true, &processedEvent); 184:39.34 ^~ 184:39.34 In file included from ${PROJECT}/obj-build-mer-qt-xr/dist/include /nsThreadUtils.h:13, 184:39.34 from ${PROJECT}/gecko-dev/mobile/sailfishos/components /nsClipboard.cpp:10: 184:39.34 ${PROJECT}/obj-build-mer-qt-xr/dist/include/MainThreadUtils.h:12:7: note: forward declaration of ‘class nsIThread’ 184:39.34 class nsIThread; 184:39.34 ^~~~~~~~~ 184:39.43 In file included from ${PROJECT}/gecko-dev/mobile/sailfishos /components/nsClipboard.h:11, 184:39.43 from ${PROJECT}/gecko-dev/mobile/sailfishos /components/nsClipboard.cpp: : 184:39.43 ${PROJECT}/obj-build-mer-qt-xr/dist/include/nsCOMPtr.h: In instantiation of ‘void nsCOMPtrChecking the nsIThread.h file the ProcessNextEvent() method is definitely there, so I'm guessing both these errors are consequences of the header file not being included. Now I've added it in, let's see if that helps.::assert_validity() [with T = nsIThread]’: 184:39.43 ${PROJECT}/obj-build-mer-qt-xr/dist/include/nsCOMPtr.h:477:5: required from ‘nsCOMPtr ::nsCOMPtr() [with T = nsIThread]’ 184:39.43 ${PROJECT}/gecko-dev/mobile/sailfishos/components/nsClipboard.cpp:86:23: required from here 184:39.43 ${PROJECT}/obj-build-mer-qt-xr/dist/include/nsCOMPtr.h:436:21: error: static assertion failed: nsCOMPtr only works for types with IIDs. Either use RefPtr; add an IID to your type with NS_DECLARE_STATIC_IID_ACCESSOR/NS_DEFINE_STATIC_IID_ACCESSOR; or make the nsCOMPtr point to a base class with an IID. 184:39.43 static_assert(1 < sizeof(TestForIID (nullptr)), 184:39.43 ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We're left with a whole slew of errors. I've cut out most of them for brevity, but also because we're not going to be able to fix them all today: most we'll have to come back to tomorrow.
But the errors are actually really important: they're the most significant upstream change we've yet hit, and they deserve inclusion in full. But we'll come to that in due course. Here, at any rate, are the first few errors:
226:53.87 mobile/sailfishos 227:03.66 In file included from ${PROJECT}/gecko-dev/mobile/sailfishos/embedthread /EmbedLiteCompositorBridgeParent.cpp:8: 227:03.66 ${PROJECT}/gecko-dev/mobile/sailfishos/embedthread /EmbedLiteCompositorBridgeParent.h:29:7: error: cannot derive from ‘final’ base ‘mozilla::layers::CompositorBridgeParent’ in derived type ‘mozilla::embedlite::EmbedLiteCompositorBridgeParent’ 227:03.66 class EmbedLiteCompositorBridgeParent : public mozilla::layers::CompositorBridgeParent 227:03.66 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227:03.66 ${PROJECT}/gecko-dev/mobile/sailfishos/embedthread /EmbedLiteCompositorBridgeParent.h:58:16: error: ‘virtual void mozilla::embedlite::EmbedLiteCompositorBridgeParent ::CompositeToDefaultTarget(mozilla::layers::PCompositorBridgeParent ::VsyncId)’ marked ‘override’, but does not override 227:03.66 virtual void CompositeToDefaultTarget(VsyncId aId) override; 227:03.66 ^~~~~~~~~~~~~~~~~~~~~~~~ 227:04.21 ${PROJECT}/gecko-dev/mobile/sailfishos/embedthread /EmbedLiteCompositorBridgeParent.cpp: In constructor ‘mozilla::embedlite ::EmbedLiteCompositorBridgeParent::EmbedLiteCompositorBridgeParent (uint32_t, mozilla::layers::CompositorManagerParent*, mozilla ::CSSToLayoutDeviceScale, const TimeDuration&, const CompositorOptions&, bool, const IntSize&)’: 227:04.21 ${PROJECT}/gecko-dev/mobile/sailfishos/embedthread /EmbedLiteCompositorBridgeParent.cpp:60:16: error: ‘AddBoolVarCache’ is not a member of ‘mozilla::Preferences’ 227:04.21 Preferences::AddBoolVarCache(&mUseExternalGLContext, 227:04.21 ^~~~~~~~~~~~~~~ 227:04.21 ${PROJECT}/gecko-dev/mobile/sailfishos/embedthread /EmbedLiteCompositorBridgeParent.cpp: In member function ‘void mozilla::embedlite::EmbedLiteCompositorBridgeParent::PrepareOffscreen()’: 227:04.21 ${PROJECT}/gecko-dev/mobile/sailfishos/embedthread /EmbedLiteCompositorBridgeParent.cpp:111:5: error: ‘GLScreenBuffer’ was not declared in this scope 227:04.21 GLScreenBuffer* screen = context->Screen(); 227:04.21 ^~~~~~~~~~~~~~ [...]That's actually only a quarter of the errors that were actually generated. There were a real lot of errors.
Starting from the top, the first problem is that the CompositorBridgeParent class is marked as final. Final classes are supposed to be classes that can't be inherited from; none of their constituent parts can be overridden. But EmbedLite wants EmbedLiteCompositorBridgeParent to subclass it.
This turns out not to be new, and there's already a patch 0018 with the title "Make it possible to extend CompositorBridgeParent" that removes the final annotation to allow this to happen.
The patch is really simple, just removing the final annotation from the class, and it applies without the need for any manual teasing. Nice! At least some of the other errors in the output above could well be caused by this one small change, although it's not clear that this will cover all of them. But the easiest way to clear this question up is to run the build again.
$ patch -d gecko-dev -p1 < rpm/0018-sailfishos-compositor-Make-it-possible-to-extend-Com.patch patching file gfx/layers/ipc/CompositorBridgeParent.h Hunk #1 succeeded at 308 (offset -4 lines).It'll take another few hours for the build to complete and it's quite later here, so I'll have to wait to find out the result until the morning. For all the other posts, check out my full Gecko Dev Diary.
Comments
Uncover Disqus comments