Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/toolkit/components/remote/nsGTKRemoteService.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim:expandtab:shiftwidth=2:tabstop=8:
3
 */
4
/* This Source Code Form is subject to the terms of the Mozilla Public
5
 * License, v. 2.0. If a copy of the MPL was not distributed with this
6
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8
#include "nsGTKRemoteService.h"
9
10
#include <gtk/gtk.h>
11
#include <gdk/gdk.h>
12
#include <gdk/gdkx.h>
13
14
#include "nsIBaseWindow.h"
15
#include "nsIDocShell.h"
16
#include "nsPIDOMWindow.h"
17
#include "mozilla/ModuleUtils.h"
18
#include "nsIServiceManager.h"
19
#include "nsIWeakReference.h"
20
#include "nsIWidget.h"
21
#include "nsIAppShellService.h"
22
#include "nsAppShellCID.h"
23
24
#include "nsCOMPtr.h"
25
26
#include "nsGTKToolkit.h"
27
28
NS_IMPL_ISUPPORTS(nsGTKRemoteService,
29
                  nsIRemoteService)
30
31
NS_IMETHODIMP
32
nsGTKRemoteService::Startup(const char* aAppName, const char* aProfileName)
33
0
{
34
0
  NS_ASSERTION(aAppName, "Don't pass a null appname!");
35
0
36
0
  if (mServerWindow) return NS_ERROR_ALREADY_INITIALIZED;
37
0
38
0
  XRemoteBaseStartup(aAppName, aProfileName);
39
0
40
0
  mServerWindow = gtk_invisible_new();
41
0
  gtk_widget_realize(mServerWindow);
42
0
  HandleCommandsFor(mServerWindow, nullptr);
43
0
44
0
  for (auto iter = mWindows.Iter(); !iter.Done(); iter.Next()) {
45
0
    HandleCommandsFor(iter.Key(), iter.UserData());
46
0
  }
47
0
48
0
  return NS_OK;
49
0
}
50
51
static nsIWidget* GetMainWidget(nsPIDOMWindowInner* aWindow)
52
0
{
53
0
  // get the native window for this instance
54
0
  nsCOMPtr<nsIBaseWindow> baseWindow
55
0
    (do_QueryInterface(aWindow->GetDocShell()));
56
0
  NS_ENSURE_TRUE(baseWindow, nullptr);
57
0
58
0
  nsCOMPtr<nsIWidget> mainWidget;
59
0
  baseWindow->GetMainWidget(getter_AddRefs(mainWidget));
60
0
  return mainWidget;
61
0
}
62
63
NS_IMETHODIMP
64
nsGTKRemoteService::RegisterWindow(mozIDOMWindow* aWindow)
65
0
{
66
0
  nsIWidget* mainWidget = GetMainWidget(nsPIDOMWindowInner::From(aWindow));
67
0
  NS_ENSURE_TRUE(mainWidget, NS_ERROR_FAILURE);
68
0
69
0
  GtkWidget* widget =
70
0
    (GtkWidget*) mainWidget->GetNativeData(NS_NATIVE_SHELLWIDGET);
71
0
  NS_ENSURE_TRUE(widget, NS_ERROR_FAILURE);
72
0
73
0
  nsCOMPtr<nsIWeakReference> weak = do_GetWeakReference(aWindow);
74
0
  NS_ENSURE_TRUE(weak, NS_ERROR_FAILURE);
75
0
76
0
  mWindows.Put(widget, weak);
77
0
78
0
  // If Startup() has already been called, immediately register this window.
79
0
  if (mServerWindow) {
80
0
    HandleCommandsFor(widget, weak);
81
0
  }
82
0
83
0
  return NS_OK;
84
0
}
85
86
NS_IMETHODIMP
87
nsGTKRemoteService::Shutdown()
88
0
{
89
0
  if (!mServerWindow)
90
0
    return NS_ERROR_NOT_INITIALIZED;
91
0
92
0
  gtk_widget_destroy(mServerWindow);
93
0
  mServerWindow = nullptr;
94
0
95
0
  return NS_OK;
96
0
}
97
98
void
99
nsGTKRemoteService::HandleCommandsFor(GtkWidget* widget,
100
                                      nsIWeakReference* aWindow)
101
0
{
102
0
  g_signal_connect(G_OBJECT(widget), "property_notify_event",
103
0
                   G_CALLBACK(HandlePropertyChange), aWindow);
104
0
105
0
  gtk_widget_add_events(widget, GDK_PROPERTY_CHANGE_MASK);
106
0
107
0
  Window window = gdk_x11_window_get_xid(gtk_widget_get_window(widget));
108
0
  nsXRemoteService::HandleCommandsFor(window);
109
0
}
110
111
gboolean
112
nsGTKRemoteService::HandlePropertyChange(GtkWidget *aWidget,
113
                                         GdkEventProperty *pevent,
114
                                         nsIWeakReference *aThis)
115
0
{
116
0
  if (pevent->state == GDK_PROPERTY_NEW_VALUE) {
117
0
    Atom changedAtom = gdk_x11_atom_to_xatom(pevent->atom);
118
0
119
0
    XID window = gdk_x11_window_get_xid(gtk_widget_get_window(aWidget));
120
0
    return HandleNewProperty(window,
121
0
                             GDK_DISPLAY_XDISPLAY(gdk_display_get_default()),
122
0
                             pevent->time, changedAtom, aThis);
123
0
  }
124
0
  return FALSE;
125
0
}
126