mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-12 12:55:46 +00:00
Bug 116108, correcting calculations for windowless plugin coordinates, r=peterl, sr=attinasi
This commit is contained in:
parent
505722f250
commit
1fad9df894
@ -1479,6 +1479,42 @@ nsObjectFrame::ContentChanged(nsIPresContext* aPresContext,
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult nsObjectFrame::GetWindowOriginInPixels(nsIPresContext * aPresContext, PRBool aWindowless, nsPoint * aOrigin)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aPresContext);
|
||||
NS_ENSURE_ARG_POINTER(aOrigin);
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
nsIView * parentWithView;
|
||||
nsPoint origin;
|
||||
nsPoint offset(0,0);
|
||||
|
||||
GetOffsetFromView(aPresContext, origin, &parentWithView);
|
||||
|
||||
// if it's windowless we want to get the offset from the parent frame
|
||||
if (aWindowless) {
|
||||
nsIWidget* aWidget;
|
||||
parentWithView->GetOffsetFromWidget(&offset.x, &offset.y, aWidget);
|
||||
origin += offset;
|
||||
|
||||
nsIFrame* parentFrame;
|
||||
GetParentWithView(aPresContext, &parentFrame);
|
||||
|
||||
if(parentFrame) {
|
||||
nsPoint originFrame;
|
||||
parentFrame->GetOffsetFromView(aPresContext, originFrame, &parentWithView);
|
||||
origin += originFrame;
|
||||
}
|
||||
}
|
||||
|
||||
float t2p;
|
||||
aPresContext->GetTwipsToPixels(&t2p);
|
||||
aOrigin->x = NSTwipsToIntPixels(origin.x, t2p);
|
||||
aOrigin->y = NSTwipsToIntPixels(origin.y, t2p);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsObjectFrame::DidReflow(nsIPresContext* aPresContext,
|
||||
const nsHTMLReflowState* aReflowState,
|
||||
@ -1488,84 +1524,62 @@ nsObjectFrame::DidReflow(nsIPresContext* aPresContext,
|
||||
|
||||
// The view is created hidden; once we have reflowed it and it has been
|
||||
// positioned then we show it.
|
||||
if (NS_FRAME_REFLOW_FINISHED == aStatus && !IsHidden()) {
|
||||
nsIView* view = nsnull;
|
||||
GetView(aPresContext, &view);
|
||||
if (nsnull != view) {
|
||||
nsCOMPtr<nsIViewManager> vm;
|
||||
view->GetViewManager(*getter_AddRefs(vm));
|
||||
if (vm) {
|
||||
vm->SetViewVisibility(view, nsViewVisibility_kShow);
|
||||
}
|
||||
}
|
||||
if ((aStatus != NS_FRAME_REFLOW_FINISHED) || IsHidden())
|
||||
return rv;
|
||||
|
||||
if (nsnull != mInstanceOwner) {
|
||||
nsPluginWindow *window;
|
||||
|
||||
if (NS_OK == mInstanceOwner->GetWindow(window)) {
|
||||
nsIView *parentWithView;
|
||||
nsPoint origin;
|
||||
nsIPluginInstance *inst;
|
||||
float t2p;
|
||||
aPresContext->GetTwipsToPixels(&t2p);
|
||||
nscoord offx = 0;
|
||||
nscoord offy = 0;
|
||||
|
||||
GetOffsetFromView(aPresContext, origin, &parentWithView);
|
||||
|
||||
// if it's windowless we want to get the offset from the parent frame
|
||||
if (window->type == nsPluginWindowType_Drawable)
|
||||
{
|
||||
|
||||
nsIWidget* aWidget;
|
||||
parentWithView->GetOffsetFromWidget(&offx, &offy, aWidget);
|
||||
|
||||
nsIFrame* parentFrame;
|
||||
GetParentWithView(aPresContext, &parentFrame);
|
||||
|
||||
if(parentFrame != nsnull)
|
||||
parentFrame->GetOffsetFromView(aPresContext, origin, &parentWithView);
|
||||
|
||||
}
|
||||
|
||||
window->x = NSTwipsToIntPixels(origin.x + offx, t2p);
|
||||
window->y = NSTwipsToIntPixels(origin.y + offy, t2p);
|
||||
// window->width = NSTwipsToIntPixels(aMetrics.width, t2p);
|
||||
// window->height = NSTwipsToIntPixels(aMetrics.height, t2p);
|
||||
|
||||
// refresh the plugin port as well
|
||||
window->window = mInstanceOwner->GetPluginPort();
|
||||
|
||||
// beard: to preserve backward compatibility with Communicator 4.X, the
|
||||
// clipRect must be in port coordinates.
|
||||
#ifndef XP_MAC
|
||||
// this is only well-defined on the Mac OS anyway, or perhaps for windowless plugins.
|
||||
window->clipRect.top = 0;
|
||||
window->clipRect.left = 0;
|
||||
window->clipRect.bottom = window->clipRect.top + window->height;
|
||||
window->clipRect.right = window->clipRect.left + window->width;
|
||||
#else
|
||||
// now that we have finished the reflow process, the widget is properly positioned
|
||||
// and we can validate the plugin clipping information by syncing the plugin
|
||||
// window info to reflect the current widget location.
|
||||
mInstanceOwner->FixUpPluginWindow();
|
||||
#endif
|
||||
if (NS_OK == mInstanceOwner->GetInstance(inst)) {
|
||||
inst->SetWindow(window);
|
||||
NS_RELEASE(inst);
|
||||
}
|
||||
|
||||
mInstanceOwner->ReleasePluginPort((nsPluginPort *)window->window);
|
||||
|
||||
if (mWidget)
|
||||
{
|
||||
PRInt32 x = NSTwipsToIntPixels(origin.x, t2p);
|
||||
PRInt32 y = NSTwipsToIntPixels(origin.y, t2p);
|
||||
mWidget->Move(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
nsIView* view = nsnull;
|
||||
GetView(aPresContext, &view);
|
||||
if (view) {
|
||||
nsCOMPtr<nsIViewManager> vm;
|
||||
view->GetViewManager(*getter_AddRefs(vm));
|
||||
if (vm)
|
||||
vm->SetViewVisibility(view, nsViewVisibility_kShow);
|
||||
}
|
||||
|
||||
nsPluginWindow *window;
|
||||
|
||||
if (!mInstanceOwner || NS_FAILED(mInstanceOwner->GetWindow(window)))
|
||||
return rv;
|
||||
|
||||
PRBool windowless = (window->type == nsPluginWindowType_Drawable);
|
||||
|
||||
// if we are on Mac or windowless on Windows we will get Paint
|
||||
// event anyway so there is no need to update plugin window
|
||||
// and call NPP_SetWindow here, it'll be done in Paint.
|
||||
// Windowed plugins thought need it to be done here, there will
|
||||
// no chance to do it later because they will get paint event
|
||||
// from the OS itself
|
||||
#ifdef XP_MAC
|
||||
return rv;
|
||||
#endif // XP_MAC
|
||||
|
||||
if(windowless)
|
||||
return rv;
|
||||
|
||||
nsPoint origin;
|
||||
GetWindowOriginInPixels(aPresContext, windowless, &origin);
|
||||
|
||||
window->x = origin.x;
|
||||
window->y = origin.y;
|
||||
|
||||
// refresh the plugin port as well
|
||||
window->window = mInstanceOwner->GetPluginPort();
|
||||
|
||||
nsIPluginInstance *inst;
|
||||
|
||||
if (NS_OK == mInstanceOwner->GetInstance(inst)) {
|
||||
inst->SetWindow(window);
|
||||
NS_RELEASE(inst);
|
||||
}
|
||||
|
||||
mInstanceOwner->ReleasePluginPort((nsPluginPort *)window->window);
|
||||
|
||||
if (mWidget) {
|
||||
PRInt32 x = origin.x;
|
||||
PRInt32 y = origin.y;
|
||||
mWidget->Move(x, y);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
@ -156,6 +156,8 @@ protected:
|
||||
|
||||
nsresult NotifyContentObjectWrapper();
|
||||
|
||||
nsresult GetWindowOriginInPixels(nsIPresContext * aPresContext, PRBool aWindoless, nsPoint* aOrigin);
|
||||
|
||||
private:
|
||||
nsPluginInstanceOwner *mInstanceOwner;
|
||||
nsIURI *mFullURL;
|
||||
|
@ -1479,6 +1479,42 @@ nsObjectFrame::ContentChanged(nsIPresContext* aPresContext,
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult nsObjectFrame::GetWindowOriginInPixels(nsIPresContext * aPresContext, PRBool aWindowless, nsPoint * aOrigin)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aPresContext);
|
||||
NS_ENSURE_ARG_POINTER(aOrigin);
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
nsIView * parentWithView;
|
||||
nsPoint origin;
|
||||
nsPoint offset(0,0);
|
||||
|
||||
GetOffsetFromView(aPresContext, origin, &parentWithView);
|
||||
|
||||
// if it's windowless we want to get the offset from the parent frame
|
||||
if (aWindowless) {
|
||||
nsIWidget* aWidget;
|
||||
parentWithView->GetOffsetFromWidget(&offset.x, &offset.y, aWidget);
|
||||
origin += offset;
|
||||
|
||||
nsIFrame* parentFrame;
|
||||
GetParentWithView(aPresContext, &parentFrame);
|
||||
|
||||
if(parentFrame) {
|
||||
nsPoint originFrame;
|
||||
parentFrame->GetOffsetFromView(aPresContext, originFrame, &parentWithView);
|
||||
origin += originFrame;
|
||||
}
|
||||
}
|
||||
|
||||
float t2p;
|
||||
aPresContext->GetTwipsToPixels(&t2p);
|
||||
aOrigin->x = NSTwipsToIntPixels(origin.x, t2p);
|
||||
aOrigin->y = NSTwipsToIntPixels(origin.y, t2p);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsObjectFrame::DidReflow(nsIPresContext* aPresContext,
|
||||
const nsHTMLReflowState* aReflowState,
|
||||
@ -1488,84 +1524,62 @@ nsObjectFrame::DidReflow(nsIPresContext* aPresContext,
|
||||
|
||||
// The view is created hidden; once we have reflowed it and it has been
|
||||
// positioned then we show it.
|
||||
if (NS_FRAME_REFLOW_FINISHED == aStatus && !IsHidden()) {
|
||||
nsIView* view = nsnull;
|
||||
GetView(aPresContext, &view);
|
||||
if (nsnull != view) {
|
||||
nsCOMPtr<nsIViewManager> vm;
|
||||
view->GetViewManager(*getter_AddRefs(vm));
|
||||
if (vm) {
|
||||
vm->SetViewVisibility(view, nsViewVisibility_kShow);
|
||||
}
|
||||
}
|
||||
if ((aStatus != NS_FRAME_REFLOW_FINISHED) || IsHidden())
|
||||
return rv;
|
||||
|
||||
if (nsnull != mInstanceOwner) {
|
||||
nsPluginWindow *window;
|
||||
|
||||
if (NS_OK == mInstanceOwner->GetWindow(window)) {
|
||||
nsIView *parentWithView;
|
||||
nsPoint origin;
|
||||
nsIPluginInstance *inst;
|
||||
float t2p;
|
||||
aPresContext->GetTwipsToPixels(&t2p);
|
||||
nscoord offx = 0;
|
||||
nscoord offy = 0;
|
||||
|
||||
GetOffsetFromView(aPresContext, origin, &parentWithView);
|
||||
|
||||
// if it's windowless we want to get the offset from the parent frame
|
||||
if (window->type == nsPluginWindowType_Drawable)
|
||||
{
|
||||
|
||||
nsIWidget* aWidget;
|
||||
parentWithView->GetOffsetFromWidget(&offx, &offy, aWidget);
|
||||
|
||||
nsIFrame* parentFrame;
|
||||
GetParentWithView(aPresContext, &parentFrame);
|
||||
|
||||
if(parentFrame != nsnull)
|
||||
parentFrame->GetOffsetFromView(aPresContext, origin, &parentWithView);
|
||||
|
||||
}
|
||||
|
||||
window->x = NSTwipsToIntPixels(origin.x + offx, t2p);
|
||||
window->y = NSTwipsToIntPixels(origin.y + offy, t2p);
|
||||
// window->width = NSTwipsToIntPixels(aMetrics.width, t2p);
|
||||
// window->height = NSTwipsToIntPixels(aMetrics.height, t2p);
|
||||
|
||||
// refresh the plugin port as well
|
||||
window->window = mInstanceOwner->GetPluginPort();
|
||||
|
||||
// beard: to preserve backward compatibility with Communicator 4.X, the
|
||||
// clipRect must be in port coordinates.
|
||||
#ifndef XP_MAC
|
||||
// this is only well-defined on the Mac OS anyway, or perhaps for windowless plugins.
|
||||
window->clipRect.top = 0;
|
||||
window->clipRect.left = 0;
|
||||
window->clipRect.bottom = window->clipRect.top + window->height;
|
||||
window->clipRect.right = window->clipRect.left + window->width;
|
||||
#else
|
||||
// now that we have finished the reflow process, the widget is properly positioned
|
||||
// and we can validate the plugin clipping information by syncing the plugin
|
||||
// window info to reflect the current widget location.
|
||||
mInstanceOwner->FixUpPluginWindow();
|
||||
#endif
|
||||
if (NS_OK == mInstanceOwner->GetInstance(inst)) {
|
||||
inst->SetWindow(window);
|
||||
NS_RELEASE(inst);
|
||||
}
|
||||
|
||||
mInstanceOwner->ReleasePluginPort((nsPluginPort *)window->window);
|
||||
|
||||
if (mWidget)
|
||||
{
|
||||
PRInt32 x = NSTwipsToIntPixels(origin.x, t2p);
|
||||
PRInt32 y = NSTwipsToIntPixels(origin.y, t2p);
|
||||
mWidget->Move(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
nsIView* view = nsnull;
|
||||
GetView(aPresContext, &view);
|
||||
if (view) {
|
||||
nsCOMPtr<nsIViewManager> vm;
|
||||
view->GetViewManager(*getter_AddRefs(vm));
|
||||
if (vm)
|
||||
vm->SetViewVisibility(view, nsViewVisibility_kShow);
|
||||
}
|
||||
|
||||
nsPluginWindow *window;
|
||||
|
||||
if (!mInstanceOwner || NS_FAILED(mInstanceOwner->GetWindow(window)))
|
||||
return rv;
|
||||
|
||||
PRBool windowless = (window->type == nsPluginWindowType_Drawable);
|
||||
|
||||
// if we are on Mac or windowless on Windows we will get Paint
|
||||
// event anyway so there is no need to update plugin window
|
||||
// and call NPP_SetWindow here, it'll be done in Paint.
|
||||
// Windowed plugins thought need it to be done here, there will
|
||||
// no chance to do it later because they will get paint event
|
||||
// from the OS itself
|
||||
#ifdef XP_MAC
|
||||
return rv;
|
||||
#endif // XP_MAC
|
||||
|
||||
if(windowless)
|
||||
return rv;
|
||||
|
||||
nsPoint origin;
|
||||
GetWindowOriginInPixels(aPresContext, windowless, &origin);
|
||||
|
||||
window->x = origin.x;
|
||||
window->y = origin.y;
|
||||
|
||||
// refresh the plugin port as well
|
||||
window->window = mInstanceOwner->GetPluginPort();
|
||||
|
||||
nsIPluginInstance *inst;
|
||||
|
||||
if (NS_OK == mInstanceOwner->GetInstance(inst)) {
|
||||
inst->SetWindow(window);
|
||||
NS_RELEASE(inst);
|
||||
}
|
||||
|
||||
mInstanceOwner->ReleasePluginPort((nsPluginPort *)window->window);
|
||||
|
||||
if (mWidget) {
|
||||
PRInt32 x = origin.x;
|
||||
PRInt32 y = origin.y;
|
||||
mWidget->Move(x, y);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
@ -156,6 +156,8 @@ protected:
|
||||
|
||||
nsresult NotifyContentObjectWrapper();
|
||||
|
||||
nsresult GetWindowOriginInPixels(nsIPresContext * aPresContext, PRBool aWindoless, nsPoint* aOrigin);
|
||||
|
||||
private:
|
||||
nsPluginInstanceOwner *mInstanceOwner;
|
||||
nsIURI *mFullURL;
|
||||
|
Loading…
Reference in New Issue
Block a user