Back out both patches for bug 647216 due to regression documented in bug 806244.

This commit is contained in:
Josh Aas 2012-11-01 09:19:24 -04:00
parent 52160f6a8f
commit bceb631bc5
11 changed files with 59 additions and 275 deletions

View File

@ -511,12 +511,11 @@ nsDOMWindowUtils::SendMouseEvent(const nsAString& aType,
int32_t aModifiers,
bool aIgnoreRootScrollFrame,
float aPressure,
unsigned short aInputSourceArg,
bool *aPreventDefault)
unsigned short aInputSourceArg)
{
return SendMouseEventCommon(aType, aX, aY, aButton, aClickCount, aModifiers,
aIgnoreRootScrollFrame, aPressure,
aInputSourceArg, false, aPreventDefault);
aInputSourceArg, false);
}
NS_IMETHODIMP
@ -533,7 +532,7 @@ nsDOMWindowUtils::SendMouseEventToWindow(const nsAString& aType,
SAMPLE_LABEL("nsDOMWindowUtils", "SendMouseEventToWindow");
return SendMouseEventCommon(aType, aX, aY, aButton, aClickCount, aModifiers,
aIgnoreRootScrollFrame, aPressure,
aInputSourceArg, true, nullptr);
aInputSourceArg, true);
}
static nsIntPoint
@ -556,8 +555,7 @@ nsDOMWindowUtils::SendMouseEventCommon(const nsAString& aType,
bool aIgnoreRootScrollFrame,
float aPressure,
unsigned short aInputSourceArg,
bool aToWindow,
bool *aPreventDefault)
bool aToWindow)
{
if (!nsContentUtils::IsCallerChrome()) {
return NS_ERROR_DOM_SECURITY_ERR;
@ -584,9 +582,7 @@ nsDOMWindowUtils::SendMouseEventCommon(const nsAString& aType,
else if (aType.EqualsLiteral("contextmenu")) {
msg = NS_CONTEXTMENU;
contextMenuKey = (aButton == 0);
} else if (aType.EqualsLiteral("MozMouseHittest"))
msg = NS_MOUSE_MOZHITTEST;
else
} else
return NS_ERROR_FAILURE;
if (aInputSourceArg == nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN) {
@ -627,10 +623,7 @@ nsDOMWindowUtils::SendMouseEventCommon(const nsAString& aType,
status = nsEventStatus_eIgnore;
return presShell->HandleEvent(view->GetFrame(), &event, false, &status);
}
nsresult rv = widget->DispatchEvent(&event, status);
*aPreventDefault = (status == nsEventStatus_eConsumeNoDefault);
return rv;
return widget->DispatchEvent(&event, status);
}
NS_IMETHODIMP

View File

@ -44,8 +44,7 @@ protected:
bool aIgnoreRootScrollFrame,
float aPressure,
unsigned short aInputSourceArg,
bool aToWindow,
bool *aPreventDefault);
bool aToWindow);
static mozilla::widget::Modifiers GetWidgetModifiers(int32_t aModifiers);
};

View File

@ -40,7 +40,7 @@ interface nsIDOMTouch;
interface nsIDOMClientRect;
interface nsIURI;
[scriptable, uuid(b3a3589d-cc9d-4123-9b21-51c66e88b436)]
[scriptable, uuid(C98B7275-93C4-4EAD-B7CF-573D872C1071)]
interface nsIDOMWindowUtils : nsISupports {
/**
@ -204,8 +204,7 @@ interface nsIDOMWindowUtils : nsISupports {
const long MODIFIER_OS = 0x0400;
/** Synthesize a mouse event. The event types supported are:
* mousedown, mouseup, mousemove, mouseover, mouseout, contextmenu,
* MozMouseHitTest
* mousedown, mouseup, mousemove, mouseover, mouseout, contextmenu
*
* Events are sent in coordinates offset by aX and aY from the window.
*
@ -237,18 +236,16 @@ interface nsIDOMWindowUtils : nsISupports {
* @param aPressure touch input pressure: 0.0 -> 1.0
* @param aInputSourceArg input source, see nsIDOMMouseEvent for values,
* defaults to mouse input.
*
* returns true if the page called prevent default on this event
*/
boolean sendMouseEvent(in AString aType,
in float aX,
in float aY,
in long aButton,
in long aClickCount,
in long aModifiers,
[optional] in boolean aIgnoreRootScrollFrame,
[optional] in float aPressure,
[optional] in unsigned short aInputSourceArg);
void sendMouseEvent(in AString aType,
in float aX,
in float aY,
in long aButton,
in long aClickCount,
in long aModifiers,
[optional] in boolean aIgnoreRootScrollFrame,
[optional] in float aPressure,
[optional] in unsigned short aInputSourceArg);
/** Synthesize a touch event. The event types supported are:
* touchstart, touchend, touchmove, and touchcancel

View File

@ -1276,9 +1276,8 @@ TabChild::RecvMouseEvent(const nsString& aType,
{
nsCOMPtr<nsIDOMWindowUtils> utils(GetDOMWindowUtils());
NS_ENSURE_TRUE(utils, true);
bool ignored = false;
utils->SendMouseEvent(aType, aX, aY, aButton, aClickCount, aModifiers,
aIgnoreRootScrollFrame, 0, 0, &ignored);
aIgnoreRootScrollFrame, 0, 0);
return true;
}

View File

@ -206,13 +206,11 @@ function _parseModifiers(aEvent)
* a mousedown followed by a mouse up is performed.
*
* aWindow is optional, and defaults to the current window object.
*
* Returns whether the event had preventDefault() called on it.
*/
function synthesizeMouse(aTarget, aOffsetX, aOffsetY, aEvent, aWindow)
{
var rect = aTarget.getBoundingClientRect();
return synthesizeMouseAtPoint(rect.left + aOffsetX, rect.top + aOffsetY,
synthesizeMouseAtPoint(rect.left + aOffsetX, rect.top + aOffsetY,
aEvent, aWindow);
}
function synthesizeTouch(aTarget, aOffsetX, aOffsetY, aEvent, aWindow)
@ -236,7 +234,6 @@ function synthesizeTouch(aTarget, aOffsetX, aOffsetY, aEvent, aWindow)
function synthesizeMouseAtPoint(left, top, aEvent, aWindow)
{
var utils = _getDOMWindowUtils(aWindow);
var defaultPrevented = false;
if (utils) {
var button = aEvent.button || 0;
@ -244,15 +241,13 @@ function synthesizeMouseAtPoint(left, top, aEvent, aWindow)
var modifiers = _parseModifiers(aEvent);
if (("type" in aEvent) && aEvent.type) {
defaultPrevented = utils.sendMouseEvent(aEvent.type, left, top, button, clickCount, modifiers);
utils.sendMouseEvent(aEvent.type, left, top, button, clickCount, modifiers);
}
else {
utils.sendMouseEvent("mousedown", left, top, button, clickCount, modifiers);
utils.sendMouseEvent("mouseup", left, top, button, clickCount, modifiers);
}
}
return defaultPrevented;
}
function synthesizeTouchAtPoint(left, top, aEvent, aWindow)
{

View File

@ -2,18 +2,12 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifdef XP_WIN
#define USE_HITTEST
#elifdef MOZ_WIDGET_COCOA
#define USE_HITTEST
#endif
this.EXPORTED_SYMBOLS = [ "WindowDraggingElement" ];
this.WindowDraggingElement = function WindowDraggingElement(elem) {
this._elem = elem;
this._window = elem.ownerDocument.defaultView;
#ifdef USE_HITTEST
#ifdef XP_WIN
if (!this.isPanel())
this._elem.addEventListener("MozMouseHittest", this, false);
else
@ -60,7 +54,7 @@ WindowDraggingElement.prototype = {
},
handleEvent: function(aEvent) {
let isPanel = this.isPanel();
#ifdef USE_HITTEST
#ifdef XP_WIN
if (!isPanel) {
if (this.shouldDrag(aEvent))
aEvent.preventDefault();

View File

@ -52,6 +52,7 @@
<statusbar id="statusbar">
<statusbarpanel>
<label id="statuslabel" value="Status"/>
<label id="statuslabelnodrag" value="No Drag" onmousedown="event.preventDefault()"/>
</statusbarpanel>
</statusbar>
@ -105,18 +106,26 @@ function test_titlebar()
var titlebar = document.getElementById("titlebar");
var label = document.getElementById("label");
// On Mac, the window can also be moved with the statusbar, but this works
// via the MozMouseHittest event, not via mouse events.
// on Mac, the window can also be moved with the statusbar
if (navigator.platform.indexOf("Mac") >= 0) {
var preventDefaulted;
var statuslabel = document.getElementById("statuslabel");
preventDefaulted = synthesizeMouse(statuslabel, 2, 2, { type: "MozMouseHittest" });
SimpleTest.ok(preventDefaulted, "MozMouseHittest should have been defaultPrevented over statusbar");
var statuslabelnodrag = document.getElementById("statuslabelnodrag");
var button = document.getElementById("button");
preventDefaulted = synthesizeMouse(button, 2, 2, { type: "MozMouseHittest" });
SimpleTest.ok(!preventDefaulted, "MozMouseHittest should NOT have been defaultPrevented over button");
origoldx = window.screenX;
origoldy = window.screenY;
synthesizeMouse(statuslabel, 2, 2, { type: "mousedown" });
synthesizeMouse(statuslabel, 22, 22, { type: "mousemove" });
SimpleTest.is(window.screenX, origoldx + 20, "move window with statusbar horizontal");
SimpleTest.is(window.screenY, origoldy + 20, "move window with statusbar vertical");
synthesizeMouse(statuslabel, 22, 22, { type: "mouseup" });
// event was cancelled so the drag should not have occurred
synthesizeMouse(statuslabelnodrag, 2, 2, { type: "mousedown" });
synthesizeMouse(statuslabelnodrag, 22, 22, { type: "mousemove" });
SimpleTest.is(window.screenX, origoldx + 20, "move window with statusbar cancelled mousedown horizontal");
SimpleTest.is(window.screenY, origoldy + 20, "move window with statusbar cancelled mousedown vertical");
synthesizeMouse(statuslabelnodrag, 22, 22, { type: "mouseup" });
}
origoldx = window.screenX;

View File

@ -183,10 +183,6 @@ typedef NSInteger NSEventGestureAxis;
- (NSEventPhase)momentumPhase;
@end
@protocol EventRedirection
- (NSView*)targetView;
@end
@interface ChildView : NSView<
#ifdef ACCESSIBILITY
mozAccessible,
@ -271,8 +267,6 @@ typedef NSInteger NSEventGestureAxis;
// class initialization
+ (void)initialize;
+ (void)registerViewForDraggedTypes:(NSView*)aView;
// these are sent to the first responder when the window key status changes
- (void)viewsWindowDidBecomeKey;
- (void)viewsWindowDidResignKey;
@ -282,8 +276,6 @@ typedef NSInteger NSEventGestureAxis;
- (void)sendFocusEvent:(uint32_t)eventType;
- (void)updateWindowDraggableStateOnMouseMove:(NSEvent*)theEvent;
- (void)handleMouseMoved:(NSEvent*)aEvent;
- (void)drawRect:(NSRect)aRect inTitlebarContext:(CGContextRef)aContext;

View File

@ -1912,20 +1912,6 @@ NSEvent* gLastDragMouseDownEvent = nil;
}
}
+ (void)registerViewForDraggedTypes:(NSView*)aView
{
[aView registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType,
NSStringPboardType,
NSHTMLPboardType,
NSURLPboardType,
NSFilesPromisePboardType,
kWildcardPboardType,
kCorePboardType_url,
kCorePboardType_urld,
kCorePboardType_urln,
nil]];
}
// initWithFrame:geckoChild:
- (id)initWithFrame:(NSRect)inFrame geckoChild:(nsChildView*)inChild
{
@ -1973,8 +1959,17 @@ NSEvent* gLastDragMouseDownEvent = nil;
}
// register for things we'll take from other applications
[ChildView registerViewForDraggedTypes:self];
PR_LOG(sCocoaLog, PR_LOG_ALWAYS, ("ChildView initWithFrame: registering drag types\n"));
[self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType,
NSStringPboardType,
NSHTMLPboardType,
NSURLPboardType,
NSFilesPromisePboardType,
kWildcardPboardType,
kCorePboardType_url,
kCorePboardType_urld,
kCorePboardType_urln,
nil]];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(windowBecameMain:)
name:NSWindowDidBecomeMainNotification
@ -2344,7 +2339,7 @@ NSEvent* gLastDragMouseDownEvent = nil;
- (BOOL)mouseDownCanMoveWindow
{
return [[self window] isMovableByWindowBackground];
return NO;
}
- (void)lockFocus
@ -3290,25 +3285,6 @@ NSEvent* gLastDragMouseDownEvent = nil;
mGeckoChild->DispatchEvent(&event, status);
}
- (void)updateWindowDraggableStateOnMouseMove:(NSEvent*)theEvent
{
if (!theEvent || !mGeckoChild) {
return;
}
nsCocoaWindow* windowWidget = mGeckoChild->GetXULWindowWidget();
if (!windowWidget) {
return;
}
// We assume later on that sending a hit test event won't cause widget destruction.
nsMouseEvent hitTestEvent(true, NS_MOUSE_MOZHITTEST, mGeckoChild, nsMouseEvent::eReal);
[self convertCocoaMouseEvent:theEvent toGeckoEvent:&hitTestEvent];
bool result = mGeckoChild->DispatchWindowEvent(hitTestEvent);
[windowWidget->GetCocoaWindow() setMovableByWindowBackground:result];
}
- (void)handleMouseMoved:(NSEvent*)theEvent
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
@ -4833,11 +4809,6 @@ ChildViewMouseTracker::ViewForEvent(NSEvent* aEvent)
NSPoint windowEventLocation = nsCocoaUtils::EventLocationForWindow(aEvent, window);
NSView* view = [[[window contentView] superview] hitTest:windowEventLocation];
while([view conformsToProtocol:@protocol(EventRedirection)]) {
view = [(id<EventRedirection>)view targetView];
}
if (![view isKindOfClass:[ChildView class]])
return nil;
@ -4936,7 +4907,7 @@ ChildViewMouseTracker::WindowAcceptsEvent(NSWindow* aWindow, NSEvent* aEvent,
NSWindow *ourWindow = [self window];
NSView *contentView = [ourWindow contentView];
if ([ourWindow isKindOfClass:[ToolbarWindow class]] && (self == contentView))
return [ourWindow isMovableByWindowBackground];
return NO;
return [self nsChildView_NSView_mouseDownCanMoveWindow];
}

View File

@ -18,7 +18,6 @@
class nsCocoaWindow;
class nsChildView;
class nsMenuBarX;
@class ChildView;
// Value copied from BITMAP_MAX_AREA, used in nsNativeThemeCocoa.mm
#define CUIDRAW_MAX_AREA 500000
@ -177,7 +176,6 @@ typedef struct _nsCocoaWindowList {
TitlebarAndBackgroundColor *mColor;
float mUnifiedToolbarHeight;
NSColor *mBackgroundColor;
NSView *mTitlebarView; // strong
}
// Pass nil here to get the default appearance.
- (void)setTitlebarColor:(NSColor*)aColor forActiveWindow:(BOOL)aActive;
@ -188,7 +186,6 @@ typedef struct _nsCocoaWindowList {
- (void)setTitlebarNeedsDisplayInRect:(NSRect)aRect sync:(BOOL)aSync;
- (void)setTitlebarNeedsDisplayInRect:(NSRect)aRect;
- (void)setDrawsContentsIntoWindowFrame:(BOOL)aState;
- (ChildView*)mainChildView;
@end
class nsCocoaWindow : public nsBaseWidget, public nsPIWidgetCocoa

View File

@ -447,10 +447,6 @@ nsresult nsCocoaWindow::CreateNativeWindow(const NSRect &aRect,
[mWindow setContentMinSize:NSMakeSize(60, 60)];
[mWindow disableCursorRects];
// Make sure the window starts out not draggable by the background.
// We will turn it on as necessary.
[mWindow setMovableByWindowBackground:NO];
[[WindowDataMap sharedWindowDataMap] ensureDataForWindow:mWindow];
mWindowMadeHere = true;
@ -2587,94 +2583,7 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
@end
@interface TitlebarMouseHandlingView : NSView<EventRedirection>
{
ToolbarWindow* mWindow; // weak
BOOL mProcessingRightMouseDown;
}
- (id)initWithWindow:(ToolbarWindow*)aWindow;
@end
@implementation TitlebarMouseHandlingView
- (id)initWithWindow:(ToolbarWindow*)aWindow
{
if ((self = [super initWithFrame:[aWindow titlebarRect]])) {
mWindow = aWindow;
[self setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)];
[ChildView registerViewForDraggedTypes:self];
mProcessingRightMouseDown = NO;
}
return self;
}
- (NSView*)targetView
{
return [mWindow mainChildView];
}
- (BOOL)mouseDownCanMoveWindow
{
return [mWindow isMovableByWindowBackground];
}
// We redirect many types of events to the window's mainChildView simply by
// passing the event object to the respective handler method. We don't need any
// coordinate transformations because event coordinates are relative to the
// window.
// We only need to handle event types whose target NSView is determined by the
// event's position. We don't need to handle key events and NSMouseMoved events
// because those are only sent to the window's first responder. This view
// doesn't override acceptsFirstResponder, so it will never receive those kinds
// of events.
- (void)mouseMoved:(NSEvent*)aEvent { [[self targetView] mouseMoved:aEvent]; }
- (void)mouseDown:(NSEvent*)aEvent { [[self targetView] mouseDown:aEvent]; }
- (void)mouseUp:(NSEvent*)aEvent { [[self targetView] mouseUp:aEvent]; }
- (void)mouseDragged:(NSEvent*)aEvent { [[self targetView] mouseDragged:aEvent]; }
- (void)rightMouseDown:(NSEvent*)aEvent
{
// To avoid recursion...
if (mProcessingRightMouseDown)
return;
mProcessingRightMouseDown = YES;
[[self targetView] rightMouseDown:aEvent];
mProcessingRightMouseDown = NO;
}
- (void)rightMouseUp:(NSEvent*)aEvent { [[self targetView] rightMouseUp:aEvent]; }
- (void)rightMouseDragged:(NSEvent*)aEvent { [[self targetView] rightMouseDragged:aEvent]; }
- (void)otherMouseDown:(NSEvent*)aEvent { [[self targetView] otherMouseDown:aEvent]; }
- (void)otherMouseUp:(NSEvent*)aEvent { [[self targetView] otherMouseUp:aEvent]; }
- (void)otherMouseDragged:(NSEvent*)aEvent { [[self targetView] otherMouseDragged:aEvent]; }
- (void)scrollWheel:(NSEvent*)aEvent { [[self targetView] scrollWheel:aEvent]; }
- (void)swipeWithEvent:(NSEvent*)aEvent { [[self targetView] swipeWithEvent:aEvent]; }
- (void)beginGestureWithEvent:(NSEvent*)aEvent { [[self targetView] beginGestureWithEvent:aEvent]; }
- (void)magnifyWithEvent:(NSEvent*)aEvent { [[self targetView] magnifyWithEvent:aEvent]; }
- (void)rotateWithEvent:(NSEvent*)aEvent { [[self targetView] rotateWithEvent:aEvent]; }
- (void)endGestureWithEvent:(NSEvent*)aEvent { [[self targetView] endGestureWithEvent:aEvent]; }
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{ return [[self targetView] draggingEntered:sender]; }
- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
{ return [[self targetView] draggingUpdated:sender]; }
- (void)draggingExited:(id <NSDraggingInfo>)sender
{ [[self targetView] draggingExited:sender]; }
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{ return [[self targetView] performDragOperation:sender]; }
- (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation
{ [[self targetView] draggedImage:anImage endedAt:aPoint operation:operation]; }
- (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal
{ return [[self targetView] draggingSourceOperationMaskForLocal:isLocal]; }
- (NSArray *)namesOfPromisedFilesDroppedAtDestination:(NSURL*)dropDestination
{ return [[self targetView] namesOfPromisedFilesDroppedAtDestination:dropDestination]; }
- (NSMenu*)menuForEvent:(NSEvent*)aEvent
{ return [[self targetView] menuForEvent:aEvent]; }
@end
// This class allows us to exercise control over the window's title bar. This
// allows for a "unified toolbar" look, and for extending the content area into
// the title bar. It works like this:
// This class allows us to have a "unified toolbar" style window. It works like this:
// 1) We set the window's style to textured.
// 2) Because of this, the background color applies to the entire window, including
// the titlebar area. For normal textured windows, the default pattern is a
@ -2708,11 +2617,6 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
// to the containing window - the other direction doesn't work. That's why the
// toolbar height is cached in the ToolbarWindow but nsNativeThemeCocoa can simply
// query the window for its titlebar height when drawing the toolbar.
@interface ToolbarWindow(Private)
- (void)installTitlebarMouseHandlingView;
- (void)uninstallTitlebarMouseHandlingView;
@end;
@implementation ToolbarWindow
- (id)initWithContentRect:(NSRect)aContentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)aBufferingType defer:(BOOL)aFlag
@ -2747,7 +2651,6 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
[mColor release];
[mBackgroundColor release];
[mTitlebarView release];
[super dealloc];
NS_OBJC_END_TRY_ABORT_BLOCK;
@ -2827,48 +2730,11 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
[self setTitlebarNeedsDisplayInRect:[self titlebarRect] sync:needSyncRedraw];
}
// Extending the content area into the title bar works by redirection of both
// drawing and mouse events.
// The window's NSView hierarchy looks like this:
// - border view ([[window contentView] superview])
// - transparent title bar event redirection view
// - window controls (traffic light buttons)
// - content view ([window contentView], default NSView provided by the window)
// - our main Gecko ChildView ([window mainChildView]), which has an
// OpenGL context attached to it when accelerated
// - possibly more ChildViews for plugins
//
// When the window is in title bar extension mode, the mainChildView covers the
// whole window but is only visible in the content area of the window, because
// it's a subview of the window's contentView and thus clipped to its dimensions.
// This clipping is a good thing because it avoids a few problems. For example,
// if the mainChildView weren't clipped and thus visible in the titlebar, we'd
// have have to do the rounded corner masking and the drawing of the highlight
// line ourselves.
// This would be especially hard in combination with OpenGL acceleration since
// rounded corners would require making the OpenGL context transparent, which
// would bring another set of challenges with it. Having the window controls
// draw on top of an OpenGL context could be hard, too.
//
// So title bar drawing happens in the border view. The border view's drawRect
// method is not under our control, but we can get it to call into our code
// using some tricks, see the TitlebarAndBackgroundColor class below.
// Specifically, we have it call the TitlebarDrawCallback function, which
// draws the contents of mainChildView into the provided CGContext.
// (Even if the ChildView uses OpenGL for rendering, drawing in the title bar
// will happen non-accelerated in that CGContext.)
//
// Mouse event redirection happens via a TitlebarMouseHandlingView which we
// install below.
- (void)setDrawsContentsIntoWindowFrame:(BOOL)aState
{
BOOL stateChanged = ([self drawsContentsIntoWindowFrame] != aState);
[super setDrawsContentsIntoWindowFrame:aState];
if (stateChanged && [[self delegate] isKindOfClass:[WindowDelegate class]]) {
// Here we extend / shrink our mainChildView. We do that by firing a resize
// event which will cause the ChildView to be resized to the rect returned
// by nsCocoaWindow::GetClientBounds. GetClientBounds bases its return
// value on what we return from drawsContentsIntoWindowFrame.
WindowDelegate *windowDelegate = (WindowDelegate *)[self delegate];
nsCocoaWindow *geckoWindow = [windowDelegate geckoWidget];
if (geckoWindow) {
@ -2883,35 +2749,10 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
// we'll send a mouse move event with the correct new position.
ChildViewMouseTracker::ResendLastMouseMoveEvent();
if (aState) {
[self installTitlebarMouseHandlingView];
} else {
[self uninstallTitlebarMouseHandlingView];
}
[self setTitlebarNeedsDisplayInRect:[self titlebarRect]];
}
}
- (void)installTitlebarMouseHandlingView
{
mTitlebarView = [[TitlebarMouseHandlingView alloc] initWithWindow:self];
[[[self contentView] superview] addSubview:mTitlebarView positioned:NSWindowBelow relativeTo:nil];
}
- (void)uninstallTitlebarMouseHandlingView
{
[mTitlebarView removeFromSuperview];
[mTitlebarView release];
mTitlebarView = nil;
}
- (ChildView*)mainChildView
{
NSView* view = [[[self contentView] subviews] lastObject];
if (view && [view isKindOfClass:[ChildView class]])
return (ChildView*)view;
return nil;
}
// Returning YES here makes the setShowsToolbarButton method work even though
// the window doesn't contain an NSToolbar.
- (BOOL)_hasToolbar
@ -2980,9 +2821,6 @@ static const NSString* kStateShowsToolbarButton = @"showsToolbarButton";
if (delegate && [delegate isKindOfClass:[WindowDelegate class]]) {
nsCocoaWindow *widget = [(WindowDelegate *)delegate geckoWidget];
if (widget) {
if (type == NSMouseMoved) {
[[self mainChildView] updateWindowDraggableStateOnMouseMove:anEvent];
}
if (gGeckoAppModalWindowList && (widget != gGeckoAppModalWindowList->window))
return;
if (widget->HasModalDescendents())
@ -3048,8 +2886,8 @@ TitlebarDrawCallback(void* aInfo, CGContextRef aContext)
NSRect titlebarRect = [window titlebarRect];
if ([window drawsContentsIntoWindowFrame]) {
ChildView* view = [window mainChildView];
if (!view)
NSView* view = [[[window contentView] subviews] lastObject];
if (!view || ![view isKindOfClass:[ChildView class]])
return;
// Gecko drawing assumes flippedness, but the current context isn't flipped
@ -3060,7 +2898,7 @@ TitlebarDrawCallback(void* aInfo, CGContextRef aContext)
CGContextTranslateCTM(aContext, 0.0f, -[window frame].size.height);
NSRect flippedTitlebarRect = { NSZeroPoint, titlebarRect.size };
[view drawRect:flippedTitlebarRect inTitlebarContext:aContext];
[(ChildView*)view drawRect:flippedTitlebarRect inTitlebarContext:aContext];
} else {
BOOL isMain = [window isMainWindow];
NSColor *titlebarColor = [window titlebarColorForActiveWindow:isMain];