Closed Bug 1230674 Opened 8 years ago Closed 8 years ago

[apz] Overscroll glow broken

Categories

(Firefox for Android Graveyard :: Toolbar, defect)

defect
Not set
normal

Tracking

(firefox47 fixed)

RESOLVED FIXED
Firefox 47
Tracking Status
firefox47 --- fixed

People

(Reporter: snorp, Assigned: rbarker)

References

Details

Attachments

(5 files, 5 obsolete files)

7.96 KB, patch
Details | Diff | Splinter Review
2.85 KB, patch
Details | Diff | Splinter Review
4.78 KB, patch
Details | Diff | Splinter Review
3.18 KB, patch
Details | Diff | Splinter Review
1.10 KB, patch
Details | Diff | Splinter Review
We need to hook APZ up to the java overscroll bits. Luckily, we don't need LayerRenderer or ViewportMetrics stuff for this.
Assignee: nobody → rbarker
Attachment #8711971 - Flags: review?(snorp)
Attachment #8711972 - Flags: review?(snorp)
Attachment #8711973 - Flags: review?(snorp)
Attachment #8711974 - Flags: review?(bugmail.mozilla)
Attachment #8711975 - Flags: review?(snorp)
Comment on attachment 8711971 [details] [diff] [review]
0001-Bug-1230674-part-1-Add-Overscroll-API-to-NativePanZoomController-16012517-2cafb31.patch

Review of attachment 8711971 [details] [diff] [review]:
-----------------------------------------------------------------

looks good with one nit

::: mobile/android/base/java/org/mozilla/gecko/gfx/NativePanZoomController.java
@@ +184,5 @@
>          }
>      }
> +
> +    @WrapForJNI(allowMultithread = true)
> +    private void updateOverscrollVelocity(final float x, final float y) {

Assert which thread you're on here (Compositor?). Might have to extend ThreadUtils.java
Attachment #8711971 - Flags: review?(snorp) → review+
Attachment #8711972 - Flags: review?(snorp) → review+
Comment on attachment 8711973 [details] [diff] [review]
0003-Bug-1230674-part-3-Add-overscroll-api-to-GeckoContentController-and-AndroidContentController-16012517-5763f03.patch

Review of attachment 8711973 [details] [diff] [review]:
-----------------------------------------------------------------

looks good, but would like kats to comment on the refptr issue

::: widget/android/AndroidContentController.h
@@ +42,5 @@
>  
>      static void NotifyDefaultPrevented(mozilla::layers::APZCTreeManager* aManager,
>                                         uint64_t aInputBlockId, bool aDefaultPrevented);
> +private:
> +    RefPtr<nsWindow> mAndroidWindow;

This seems like it could create a circular ref, but I'm not sure. I defer to kats.
Attachment #8711973 - Flags: review?(snorp)
Attachment #8711973 - Flags: review?(bugmail.mozilla)
Attachment #8711973 - Flags: review+
Comment on attachment 8711975 [details] [diff] [review]
0005-Bug-1230674-part-5-enable-overscroll-flash-on-Android-16012517-493a8aa.patch

Review of attachment 8711975 [details] [diff] [review]:
-----------------------------------------------------------------

Woo!
Attachment #8711975 - Flags: review?(snorp) → review+
Comment on attachment 8711971 [details] [diff] [review]
0001-Bug-1230674-part-1-Add-Overscroll-API-to-NativePanZoomController-16012517-2cafb31.patch

Review of attachment 8711971 [details] [diff] [review]:
-----------------------------------------------------------------

::: mobile/android/base/java/org/mozilla/gecko/gfx/NativePanZoomController.java
@@ +191,5 @@
> +                @Override
> +                public void run() {
> +                  // Multiply the velocity by 1000 to match what was done in JPZ.
> +                  mOverscroll.setVelocity(x * 1000.0f, Overscroll.Axis.X);
> +                  mOverscroll.setVelocity(y * 1000.0f, Overscroll.Axis.Y);

Fix indent to 4 spaces

@@ +204,5 @@
> +            ThreadUtils.postToUiThread(new Runnable() {
> +                @Override
> +                public void run() {
> +                  mOverscroll.setDistance(x, Overscroll.Axis.X);
> +                  mOverscroll.setDistance(y, Overscroll.Axis.Y);

Ditto indent
Comment on attachment 8711973 [details] [diff] [review]
0003-Bug-1230674-part-3-Add-overscroll-api-to-GeckoContentController-and-AndroidContentController-16012517-5763f03.patch

Review of attachment 8711973 [details] [diff] [review]:
-----------------------------------------------------------------

r+ with the Destroy() override to clear the circular ref.

::: widget/android/AndroidContentController.h
@@ +42,5 @@
>  
>      static void NotifyDefaultPrevented(mozilla::layers::APZCTreeManager* aManager,
>                                         uint64_t aInputBlockId, bool aDefaultPrevented);
> +private:
> +    RefPtr<nsWindow> mAndroidWindow;

The circular ref shouldn't be a problem if you override the Destroy() function from ChromeProcessController and null out mAndroidWindow in it. Be sure to call the base class version as well, and only do the nulling out on the main thread invocation (see ChromeProcessController::Destroy, it reinvokes itself on the main thread).
Attachment #8711973 - Flags: review?(bugmail.mozilla) → review+
Comment on attachment 8711974 [details] [diff] [review]
0004-Bug-1230674-part-4-Update-AsyncPanZoomController-to-call-overscroll-api-when-building-for-Android-16012517-082f858.patch

Review of attachment 8711974 [details] [diff] [review]:
-----------------------------------------------------------------

r+ with comments addressed

::: gfx/layers/apz/src/AsyncPanZoomController.cpp
@@ +2387,5 @@
>    bool yCanScroll = mY.CanScroll();
>  
> +#if defined(MOZ_ANDROID_APZ)
> +  bool xConsumed = FuzzyEqualsAdditive(aOverscroll.x, 0.0f, COORDINATE_EPSILON);
> +  bool yConsumed = FuzzyEqualsAdditive(aOverscroll.y, 0.0f, COORDINATE_EPSILON);

Please extract the xConsumed and yConsumed assignments out of the #if. Seems unnecessary to duplicate it in both parts of the #if.

@@ +2388,5 @@
>  
> +#if defined(MOZ_ANDROID_APZ)
> +  bool xConsumed = FuzzyEqualsAdditive(aOverscroll.x, 0.0f, COORDINATE_EPSILON);
> +  bool yConsumed = FuzzyEqualsAdditive(aOverscroll.y, 0.0f, COORDINATE_EPSILON);
> +  if (mGeckoContentController && ((xCanScroll && !xConsumed) || (yCanScroll && !yConsumed))) {

Don't use mGeckoContentController directly here.

RefPtr<GeckoContentController> controller = GetGeckoContentController();
if (controller && ...) {
  controller->Update...
  ...
}

@@ +2511,5 @@
>      treeManagerLocal->DispatchFling(this, handoffState);
>      if (!IsZero(handoffState.mVelocity) && IsPannable() && gfxPrefs::APZOverscrollEnabled()) {
> +#if defined(MOZ_ANDROID_APZ)
> +      if (mGeckoContentController) {
> +        mGeckoContentController->UpdateOverscrollVelocity(handoffState.mVelocity.x, handoffState.mVelocity.y);

Same here about mGeckoContentController, get it in a RefPtr
Attachment #8711974 - Flags: review?(bugmail.mozilla) → review+
(In reply to James Willcox (:snorp) (jwillcox@mozilla.com) from comment #6)
> Comment on attachment 8711971 [details] [diff] [review]
> 0001-Bug-1230674-part-1-Add-Overscroll-API-to-NativePanZoomController-
> 16012517-2cafb31.patch
> 
> Review of attachment 8711971 [details] [diff] [review]:
> -----------------------------------------------------------------
> 
> looks good with one nit
> 
> :::
> mobile/android/base/java/org/mozilla/gecko/gfx/NativePanZoomController.java
> @@ +184,5 @@
> >          }
> >      }
> > +
> > +    @WrapForJNI(allowMultithread = true)
> > +    private void updateOverscrollVelocity(final float x, final float y) {
> 
> Assert which thread you're on here (Compositor?). Might have to extend
> ThreadUtils.java

Instead, I only dispatch to UI thread if I'm not already on the UI thread, otherwise I call it directly. This way the functions should be callable from any thread.
Rebased and addressed comments.
Attachment #8711972 - Attachment is obsolete: true
Rebased and addressed comments.
Attachment #8711975 - Attachment is obsolete: true
https://treeherder.mozilla.org/#/jobs?repo=try&revision=9f3ef7567fb8

Also did local build with C++APZ disabled.
Backed out for Mochitest bustage on Android 4.3 API11 debug: https://hg.mozilla.org/integration/mozilla-inbound/rev/5b1fd571b0ff

Failing jobs: https://treeherder.mozilla.org/#/jobs?repo=mozilla-inbound&revision=07cdcb9b4565
Failure log: https://treeherder.mozilla.org/logviewer.html#?job_id=20518097&repo=mozilla-inbound

13:29:08     INFO -  411 INFO TEST-START | dom/base/test/test_writable-replaceable.html
13:29:08     INFO -  412 INFO TEST-OK | dom/base/test/test_writable-replaceable.html | took 3446ms
13:29:08     INFO -  INFO | automation.py | Application ran for: 0:34:13.225452
13:29:08     INFO -  INFO | zombiecheck | Reading PID log: /tmp/tmpffx0a5pidlog
13:29:09     INFO -  /data/tombstones does not exist; tombstone check skipped
13:29:10     INFO -  mozcrash Copy/paste: /builds/slave/test/build/linux64-minidump_stackwalk /tmp/tmpK6LsBY/2b0cb221-8027-550f-636eb057-0c24e755.dmp /builds/slave/test/build/symbols
13:29:17     INFO -  mozcrash Saved minidump as /builds/slave/test/build/blobber_upload_dir/2b0cb221-8027-550f-636eb057-0c24e755.dmp
13:29:17     INFO -  mozcrash Saved app info as /builds/slave/test/build/blobber_upload_dir/2b0cb221-8027-550f-636eb057-0c24e755.extra
13:29:17  WARNING -  PROCESS-CRASH | dom/base/test/test_writable-replaceable.html | application crashed [@ nsBaseWidget::Release]
13:29:17     INFO -  Crash dump filename: /tmp/tmpK6LsBY/2b0cb221-8027-550f-636eb057-0c24e755.dmp
13:29:17     INFO -  Operating system: Android
13:29:17     INFO -                    0.0.0 Linux 2.6.29-gea477bb #1 Wed Sep 26 11:04:45 PDT 2012 armv7l generic/sdk/generic:4.3.1/JLS36I/eng.gbrown.20150308.182649:eng/test-keys
13:29:17     INFO -  CPU: arm
13:29:17     INFO -       ARMv0
13:29:17     INFO -       0 CPUs
13:29:17     INFO -  Crash reason:  SIGSEGV
13:29:17     INFO -  Crash address: 0x0
13:29:17     INFO -  Process uptime: not available
13:29:17     INFO -  Thread 35 (crashed)
13:29:17     INFO -   0  libxul.so!nsBaseWidget::Release [nsBaseWidget.cpp:07cdcb9b4565 : 145 + 0x2]
13:29:17     INFO -       r0 = 0x5b309ed8    r1 = 0x3c14fd95    r2 = 0x3c14fd95    r3 = 0x00000000
13:29:17     INFO -       r4 = 0x642738a0    r5 = 0x52943100    r6 = 0x616ffc54    r7 = 0x616ffb90
13:29:17     INFO -       r8 = 0x616ffb78    r9 = 0x616ffc08   r10 = 0x616ffc10   r12 = 0x00000003
13:29:17     INFO -       fp = 0x00000000    sp = 0x616ffa98    lr = 0x59f29127    pc = 0x59f29128
13:29:17     INFO -      Found by: given as instruction pointer in context
13:29:17     INFO -   1  libxul.so!nsWindow::Release [nsWindow.cpp:07cdcb9b4565 : 90 + 0x5]
13:29:17     INFO -       r3 = 0x59f6879d    r4 = 0x5f28dd20    r5 = 0x642738a0    r6 = 0x616ffc54
13:29:17     INFO -       r7 = 0x616ffb90    r8 = 0x616ffb78    r9 = 0x616ffc08   r10 = 0x616ffc10
13:29:17     INFO -       fp = 0x00000000    sp = 0x616ffab0    pc = 0x59f687a5
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -   2  libxul.so!mozilla::widget::AndroidContentController::Destroy [RefPtr.h:07cdcb9b4565 : 362 + 0x5]
13:29:17     INFO -       r3 = 0x59f6879d    r4 = 0x5f28dd20    r5 = 0x608f68e0    r6 = 0x616ffc54
13:29:17     INFO -       r7 = 0x616ffb90    r8 = 0x616ffb78    r9 = 0x616ffc08   r10 = 0x616ffc10
13:29:17     INFO -       fp = 0x00000000    sp = 0x616ffac0    pc = 0x59f5dae3
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -   3  libxul.so!mozilla::layers::CompositorParent::LayerTreeState::~LayerTreeState [CompositorParent.cpp:07cdcb9b4565 : 111 + 0x3]
13:29:17     INFO -       r4 = 0x608f68f8    r5 = 0x608f68e0    r6 = 0x616ffc54    r7 = 0x616ffb90
13:29:17     INFO -       r8 = 0x616ffb78    r9 = 0x616ffc08   r10 = 0x616ffc10    fp = 0x00000000
13:29:17     INFO -       sp = 0x616ffac8    pc = 0x59428b95
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -   4  libxul.so!std::map<long long unsigned int, mozilla::layers::CompositorParent::LayerTreeState, std::less<long long unsigned int>, std::allocator<std::pair<long long unsigned int const, mozilla::layers::CompositorParent::LayerTreeState> > >::erase [_pair.h:07cdcb9b4565 : 51 + 0x5]
13:29:17     INFO -       r4 = 0x5bb4bc58    r5 = 0x608f68e0    r6 = 0x616ffc54    r7 = 0x616ffb90
13:29:17     INFO -       r8 = 0x616ffb78    r9 = 0x616ffc08   r10 = 0x616ffc10    fp = 0x00000000
13:29:17     INFO -       sp = 0x616ffae8    pc = 0x5942cf45
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -   5  libxul.so!mozilla::layers::CompositorParent::Destroy [CompositorParent.cpp:07cdcb9b4565 : 739 + 0xb]
13:29:17     INFO -       r3 = 0x00000001    r4 = 0x60e8b800    r5 = 0x616ffafc    r6 = 0x616ffc54
13:29:17     INFO -       r7 = 0x616ffb90    r8 = 0x616ffb78    r9 = 0x616ffc08   r10 = 0x616ffc10
13:29:17     INFO -       fp = 0x00000000    sp = 0x616ffaf8    pc = 0x5942d01d
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -   6  libxul.so!mozilla::layers::CompositorParent::RecvStop [CompositorParent.cpp:07cdcb9b4565 : 789 + 0x3]
13:29:17     INFO -       r4 = 0x60e8b800    r5 = 0x616ffcd4    r6 = 0x616ffc54    r7 = 0x616ffb90
13:29:17     INFO -       r8 = 0x616ffb78    r9 = 0x616ffc08   r10 = 0x616ffc10    fp = 0x00000000
13:29:17     INFO -       sp = 0x616ffb10    pc = 0x5942d05f
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -   7  libxul.so!mozilla::layers::PCompositorParent::OnMessageReceived [PCompositorParent.cpp:07cdcb9b4565 : 820 + 0x7]
13:29:17     INFO -       r4 = 0x60e8b800    r5 = 0x616ffcd4    r6 = 0x616ffc54    r7 = 0x616ffb90
13:29:17     INFO -       r8 = 0x616ffb78    r9 = 0x616ffc08   r10 = 0x616ffc10    fp = 0x00000000
13:29:17     INFO -       sp = 0x616ffb38    pc = 0x591c2a45
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -   8  libxul.so!mozilla::ipc::MessageChannel::DispatchSyncMessage [MessageChannel.cpp:07cdcb9b4565 : 1432 + 0x5]
13:29:17     INFO -       r4 = 0x60e8b838    r5 = 0x616ffc54    r6 = 0x616ffcd4    r7 = 0x616ffc0c
13:29:17     INFO -       r8 = 0x00000001    r9 = 0x616ffc08   r10 = 0x616ffc10    fp = 0x00000000
13:29:17     INFO -       sp = 0x616ffc00    pc = 0x5900750d
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -   9  libxul.so!mozilla::ipc::MessageChannel::DispatchMessage [MessageChannel.cpp:07cdcb9b4565 : 1377 + 0x9]
13:29:17     INFO -       r4 = 0x616ffcd4    r5 = 0x60e8b838    r6 = 0x616ffc54    r7 = 0xfffffffd
13:29:17     INFO -       r8 = 0x616ffc58    r9 = 0x00000001   r10 = 0x60ec5e20    fp = 0x2a312cb0
13:29:17     INFO -       sp = 0x616ffc48    pc = 0x59010273
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  10  libxul.so!mozilla::ipc::MessageChannel::OnMaybeDequeueOne [MessageChannel.cpp:07cdcb9b4565 : 1350 + 0x7]
13:29:17     INFO -       r4 = 0x616ffcd4    r5 = 0x60e8b838    r6 = 0x00000001    r7 = 0x616ffdf4
13:29:17     INFO -       r8 = 0x616ffd38    r9 = 0x5afe0141   r10 = 0x5afe0141    fp = 0x2a312cb0
13:29:17     INFO -       sp = 0x616ffcc8    pc = 0x59011399
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  11  libxul.so!MessageLoop::RunTask [message_loop.cc:07cdcb9b4565 : 364 + 0x7]
13:29:17     INFO -       r4 = 0x64aa4160    r5 = 0x616ffde8    r6 = 0x608f2f70    r7 = 0x616ffdf4
13:29:17     INFO -       r8 = 0x616ffd38    r9 = 0x5afe0141   r10 = 0x5afe0141    fp = 0x2a312cb0
13:29:17     INFO -       sp = 0x616ffd00    pc = 0x58fee30d
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  12  libxul.so!MessageLoop::DeferOrRunPendingTask [message_loop.cc:07cdcb9b4565 : 372 + 0x3]
13:29:17     INFO -       r4 = 0x00000001    r5 = 0x616ffd40    r6 = 0x608f2f70    r7 = 0x616ffdf4
13:29:17     INFO -       r8 = 0x616ffd38    r9 = 0x5afe0141   r10 = 0x5afe0141    fp = 0x2a312cb0
13:29:17     INFO -       sp = 0x616ffd20    pc = 0x58ff18d3
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  13  libxul.so!MessageLoop::DoWork [message_loop.cc:07cdcb9b4565 : 459 + 0x3]
13:29:17     INFO -       r3 = 0x00000000    r4 = 0x616ffde8    r5 = 0x616ffd40    r6 = 0x608f2f70
13:29:17     INFO -       r7 = 0x616ffdf4    r8 = 0x616ffd38    r9 = 0x5afe0141   r10 = 0x5afe0141
13:29:17     INFO -       fp = 0x2a312cb0    sp = 0x616ffd30    pc = 0x58ff382f
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  14  libxul.so!base::MessagePumpDefault::Run [message_pump_default.cc:07cdcb9b4565 : 34 + 0x9]
13:29:17     INFO -       r4 = 0x64344980    r5 = 0x616ffd68    r6 = 0x64344990    r7 = 0x00000001
13:29:17     INFO -       r8 = 0x616ffde8    r9 = 0x5afe0141   r10 = 0x5afe0141    fp = 0x2a312cb0
13:29:17     INFO -       sp = 0x616ffd60    pc = 0x58fee4bb
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  15  libxul.so!MessageLoop::RunInternal [message_loop.cc:07cdcb9b4565 : 234 + 0x5]
13:29:17     INFO -       r4 = 0x616ffde8    r5 = 0x616ffde8    r6 = 0x58ff39c5    r7 = 0x60ed8e34
13:29:17     INFO -       r8 = 0x60ed8e28    r9 = 0x61600000   r10 = 0x616fff00    fp = 0x2a312cb0
13:29:17     INFO -       sp = 0x616ffda0    pc = 0x58fee241
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  16  libxul.so!MessageLoop::Run [message_loop.cc:07cdcb9b4565 : 227 + 0x5]
13:29:17     INFO -       r4 = 0x616ffde8    r5 = 0x616ffde8    r6 = 0x58ff39c5    r7 = 0x60ed8e34
13:29:17     INFO -       r8 = 0x60ed8e28    r9 = 0x61600000   r10 = 0x616fff00    fp = 0x2a312cb0
13:29:17     INFO -       sp = 0x616ffdb8    pc = 0x58fee355
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  17  libxul.so!base::Thread::ThreadMain [thread.cc:07cdcb9b4565 : 172 + 0x5]
13:29:17     INFO -       r4 = 0x60ed8e20    r5 = 0x616ffde8    r6 = 0x58ff39c5    r7 = 0x60ed8e34
13:29:17     INFO -       r8 = 0x60ed8e28    r9 = 0x61600000   r10 = 0x616fff00    fp = 0x2a312cb0
13:29:17     INFO -       sp = 0x616ffdd0    pc = 0x58ff598f
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  18  libxul.so!ThreadFunc [platform_thread_posix.cc:07cdcb9b4565 : 36 + 0x5]
13:29:17     INFO -       r4 = 0x616fff00    r5 = 0x2a312cb0    r6 = 0x58ff39c5    r7 = 0x60ed8e20
13:29:17     INFO -       r8 = 0x60ed8e28    r9 = 0x61600000   r10 = 0x616fff00    fp = 0x2a312cb0
13:29:17     INFO -       sp = 0x616ffee0    pc = 0x58ff39cd
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  19  libc.so!__thread_entry [pthread_create.cpp : 92 + 0x6]
13:29:17     INFO -       r3 = 0x00000000    r4 = 0x616fff00    r5 = 0x2a312cb0    r6 = 0x58ff39c5
13:29:17     INFO -       r7 = 0x60ed8e20    r8 = 0x60ed8e28    r9 = 0x61600000   r10 = 0x616fff00
13:29:17     INFO -       fp = 0x2a312cb0    sp = 0x616ffee8    pc = 0x40033a5c
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  20  libc.so!pthread_create [pthread_create.cpp : 201 + 0x16]
13:29:17     INFO -       r3 = 0x60ed8e20    r4 = 0x00000002    r5 = 0x00100000    r6 = 0x60ed8e20
13:29:17     INFO -       r7 = 0x00000078    r8 = 0x60ed8e28    r9 = 0x61600000   r10 = 0x616fff00
13:29:17     INFO -       fp = 0x2a312cb0    sp = 0x616fff00    pc = 0x40033bd8
13:29:17     INFO -      Found by: call frame info
13:29:17     INFO -  Thread 0
13:29:17     INFO -   0  libc.so + 0x1c3dc
13:29:17     INFO -       r0 = 0xfffffffc    r1 = 0xbeae94a8    r2 = 0x00000010    r3 = 0xffffffff
13:29:17     INFO -       r4 = 0x2a040aa0    r5 = 0x00000000    r6 = 0x2a040ab4    r7 = 0x000000fc
13:29:17     INFO -       r8 = 0x2a040ae8    r9 = 0x00000014   r10 = 0x2a00d0a0   r12 = 0xbeae94a8
13:29:17     INFO -       fp = 0xbeae961c    sp = 0xbeae9488    lr = 0x400b1fb5    pc = 0x400433dc
13:29:17     INFO -      Found by: given as instruction pointer in context
Flags: needinfo?(rbarker)
Product: Firefox for Android → Firefox for Android Graveyard
You need to log in before you can comment on or make changes to this bug.