@Override
    public final void onBrowserEvent(Event event) {
        CellBasedWidgetImpl.get().onBrowserEvent(this, event);

        // Ignore spurious events (such as onblur) while we refresh the table.
        if (isRefreshing) {
            return;
        }

        // Verify that the target is still a child of this widget. IE fires focus
        // events even after the element has been removed from the DOM.
        EventTarget eventTarget = event.getEventTarget();
        if (!Element.is(eventTarget)) {
            return;
        }
        if (!getElement().isOrHasChild(Element.as(eventTarget))) {
            return;
        }
        super.onBrowserEvent(event);

        rememberFocus(event);

        Scheduler.get().scheduleDeferred(() -> {
            final String eventType = event.getType();
            if (BrowserEvents.FOCUS.equals(eventType) && isFocused) {
                onFocus();
            } else if (BrowserEvents.BLUR.equals(eventType) && !isFocused) {
                onBlur();
            }

            // Let subclasses handle the event now.
            onBrowserEvent2(event);
        });
    }
Handle browser events. Subclasses should override
{@link #onBrowserEvent2(Event)} if they want to extend browser event
handling.

@see #onBrowserEvent2(Event)
stroom-core-client-widget/src/main/java/com/google/gwt/user/cellview/client/AbstractHasData.java