SubdocumentScrollHelper(PanZoomController controller) {
    mPanZoomController = controller;
    // mUiHandler will be bound to the UI thread since that's where this constructor runs
    mUiHandler = new Handler();
    mPendingDisplacement = new PointF();

    GeckoAppShell.registerGeckoEventListener(MESSAGE_PANNING_OVERRIDE, this);
    GeckoAppShell.registerGeckoEventListener(MESSAGE_CANCEL_OVERRIDE, this);
    GeckoAppShell.registerGeckoEventListener(MESSAGE_SCROLL_ACK, this);
  }
  /** Attaches the root layer to the layer controller so that Gecko appears. */
  @Override
  public void setLayerController(LayerController layerController) {
    super.setLayerController(layerController);

    layerController.setRoot(mTileLayer);
    if (mGeckoViewport != null) {
      layerController.setViewportMetrics(mGeckoViewport);
    }

    GeckoAppShell.registerGeckoEventListener("Viewport:UpdateAndDraw", this);
    GeckoAppShell.registerGeckoEventListener("Viewport:UpdateLater", this);
    GeckoAppShell.registerGeckoEventListener("Checkerboard:Toggle", this);

    sendResizeEventIfNecessary();
  }