Merge lp:~webapps/unity-chromium-extension/staging2 into lp:unity-chromium-extension

Proposed by David Barth
Status: Merged
Approved by: David Barth
Approved revision: 265
Merged at revision: 248
Proposed branch: lp:~webapps/unity-chromium-extension/staging2
Merge into: lp:unity-chromium-extension
Diff against target: 25664 lines (+2599/-21107)
227 files modified
.bzrignore (+22/-1)
INSTALL (+0/-370)
Makefile.am (+0/-9)
Makefile.am.coverage (+0/-32)
README (+0/-1)
autogen.sh (+0/-157)
chromium-extension/Makefile.am (+0/-44)
chromium-extension/background-page.html (+0/-15)
chromium-extension/background-page.js (+251/-432)
chromium-extension/base-content-script.js (+1/-1)
chromium-extension/browser.js (+0/-154)
chromium-extension/chromium-extension.pro (+66/-0)
chromium-extension/infobar.js (+22/-18)
chromium-extension/manifest.json.in (+31/-41)
chromium-extension/unity-api-page-proxy-builder-gen.js (+0/-384)
chromium-extension/unity-api-page-proxy.js (+0/-146)
chromium-extension/unity-webapps.json.in (+2/-2)
chromium-extension/unity_api_page_proxy_generator.py (+0/-96)
common-project-config.pri (+41/-0)
common-vars.pri (+6/-0)
configure.ac (+0/-62)
coverage.pri (+49/-0)
debian/changelog (+10/-0)
debian/compat (+1/-1)
debian/control (+6/-10)
debian/copyright (+0/-45)
debian/rules (+6/-8)
debian/unity-chromium-extension.install (+4/-0)
m4/gcov.m4 (+0/-79)
messaging-host/Makefile.am (+2/-0)
messaging-host/com.canonical.webapp.installer.json.in (+9/-0)
messaging-host/connection.cpp (+152/-0)
messaging-host/connection.h (+52/-0)
messaging-host/inactivity-timer.cpp (+65/-0)
messaging-host/inactivity-timer.h (+56/-0)
messaging-host/main.cpp (+91/-0)
messaging-host/messaging-host.pro (+42/-0)
messaging-host/service.cpp (+120/-0)
messaging-host/service.h (+56/-0)
messaging-host/webapps-handler.cpp (+324/-0)
messaging-host/webapps-handler.h (+59/-0)
messaging-host/webapps-process.cpp (+28/-0)
messaging-host/webapps-process.h (+37/-0)
npapi-binding-gen/bindinggen.py (+0/-203)
npapi-binding-gen/common_gen.py (+0/-9)
npapi-binding-gen/get_functions_to_generate.sh (+0/-5)
npapi-binding-gen/header_generator.py (+0/-23)
npapi-binding-gen/header_generator_test.py (+0/-18)
npapi-binding-gen/headers.py (+0/-25)
npapi-binding-gen/npapi_meta.py (+0/-104)
npapi-binding-gen/parser.py (+0/-168)
npapi-binding-gen/parser_test.py (+0/-25)
npapi-binding-gen/prepasses.py (+0/-42)
npapi-binding-gen/prepasses_test.py (+0/-13)
npapi-binding-gen/source_generator.py (+0/-213)
npapi-binding-gen/sources_gen_test.py (+0/-25)
npapi-binding-gen/tests/data/header-gen-data-1 (+0/-135)
npapi-binding-gen/tests/data/parser-data-1 (+0/-135)
npapi-binding-gen/tests/data/parser-data-1.result (+0/-50)
npapi-binding-gen/tests/data/pre-pass-cleanup-data-1 (+0/-62)
npapi-binding-gen/tests/data/pre-pass-cleanup-data-1.result (+0/-44)
npapi-binding-gen/tests/data/pre-pass-cleanup-data-2 (+0/-176)
npapi-binding-gen/tests/data/pre-pass-cleanup-data-2.result (+0/-143)
npapi-binding-gen/tests/data/source-gen-data-1 (+0/-135)
npapi-binding-gen/unittest_gen.py (+0/-126)
npapi-plugin/Makefile.am (+0/-7)
npapi-plugin/src/Makefile.am (+0/-68)
npapi-plugin/src/libunity_npapi_plugin-0.1.pc.in (+0/-13)
npapi-plugin/src/notify-binding.c (+0/-222)
npapi-plugin/src/notify-binding.h (+0/-36)
npapi-plugin/src/npapi-headers/headers/npapi.h (+0/-895)
npapi-plugin/src/npapi-headers/headers/npfunctions.h (+0/-322)
npapi-plugin/src/npapi-headers/headers/npruntime.h (+0/-393)
npapi-plugin/src/npapi-headers/headers/nptypes.h (+0/-121)
npapi-plugin/src/unity-npapi-binding-utils.c (+0/-81)
npapi-plugin/src/unity-npapi-binding-utils.h (+0/-76)
npapi-plugin/src/unity-npapi-common.h (+0/-61)
npapi-plugin/src/unity-npapi-debug.h (+0/-36)
npapi-plugin/src/unity-npapi-plugin-entry-funcs.c (+0/-118)
npapi-plugin/src/unity-npapi-plugin-entry-funcs.h (+0/-41)
npapi-plugin/src/unity-npapi-plugin-npn-funcs.c (+0/-426)
npapi-plugin/src/unity-npapi-plugin-npn-funcs.h (+0/-32)
npapi-plugin/src/unity-npapi-plugin-pp-funcs.c (+0/-283)
npapi-plugin/src/unity-npapi-plugin-pp-funcs.h (+0/-81)
npapi-plugin/src/unity-npapi-plugin.c (+0/-188)
npapi-plugin/src/unity-npapi-plugin.h (+0/-72)
npapi-plugin/src/unity-npapi-tools.c (+0/-97)
npapi-plugin/src/unity-npapi-tools.h (+0/-30)
npapi-plugin/src/unity-webapps-base-js-object.c (+0/-564)
npapi-plugin/src/unity-webapps-base-js-object.h (+0/-84)
npapi-plugin/src/unity-webapps-binding-dispatcher.c (+0/-368)
npapi-plugin/src/unity-webapps-binding-dispatcher.h (+0/-47)
npapi-plugin/src/unity-webapps-binding-test.c (+0/-27)
npapi-plugin/src/unity-webapps-binding-test.h (+0/-11)
npapi-plugin/src/unity-webapps-binding.c (+0/-3127)
npapi-plugin/src/unity-webapps-binding.h (+0/-424)
npapi-plugin/src/unity-webapps-repository-binding.c (+0/-541)
npapi-plugin/src/unity-webapps-repository-binding.h (+0/-89)
npapi-plugin/src/unity-webapps-scriptable-object.c (+0/-91)
npapi-plugin/src/unity-webapps-scriptable-object.h (+0/-46)
npapi-plugin/src/wrapped-callback-type.c (+0/-174)
npapi-plugin/src/wrapped-callback-type.h (+0/-53)
npapi-plugin/src/wrapped-ptr-type.c (+0/-215)
npapi-plugin/src/wrapped-ptr-type.h (+0/-45)
tests/Makefile.am (+0/-1)
tests/functional/npapi/context_new_lazy_test/background-page.html (+0/-72)
tests/functional/npapi/context_new_lazy_test/manifest.json (+0/-21)
tests/functional/npapi/driver.py (+0/-32)
tests/tests.pro (+3/-0)
tests/unit/Makefile.am (+0/-1)
tests/unit/messaging-host/connection-host.cpp (+71/-0)
tests/unit/messaging-host/messaging-host.pri (+9/-0)
tests/unit/messaging-host/messaging-host.pro (+12/-0)
tests/unit/messaging-host/tst_connection.cpp (+112/-0)
tests/unit/messaging-host/tst_connection.pro (+14/-0)
tests/unit/messaging-host/tst_connection_host.pro (+14/-0)
tests/unit/messaging-host/tst_inactivity_timer.cpp (+125/-0)
tests/unit/messaging-host/tst_inactivity_timer.pro (+18/-0)
tests/unit/messaging-host/tst_service.cpp (+189/-0)
tests/unit/messaging-host/tst_service.pro (+18/-0)
tests/unit/messaging-host/tst_webapps-handler.cpp (+354/-0)
tests/unit/messaging-host/tst_webapps-handler.pro (+32/-0)
tests/unit/npapi/Makefile.am (+0/-528)
tests/unit/npapi/context-add-application-actions-test.c (+0/-149)
tests/unit/npapi/context-add-application-actions-test.h (+0/-6)
tests/unit/npapi/context-add-icon-test.c (+0/-149)
tests/unit/npapi/context-add-icon-test.h (+0/-6)
tests/unit/npapi/context-destroy-test.c (+0/-116)
tests/unit/npapi/context-destroy-test.h (+0/-6)
tests/unit/npapi/context-get-domain-test.c (+0/-102)
tests/unit/npapi/context-get-domain-test.h (+0/-6)
tests/unit/npapi/context-get-interest-id-test.c (+0/-102)
tests/unit/npapi/context-get-interest-id-test.h (+0/-6)
tests/unit/npapi/context-get-name-test.c (+0/-102)
tests/unit/npapi/context-get-name-test.h (+0/-6)
tests/unit/npapi/context-new-lazy-test.c (+0/-175)
tests/unit/npapi/context-new-lazy-test.h (+0/-6)
tests/unit/npapi/context-on-close-callback-test.c (+0/-149)
tests/unit/npapi/context-on-close-callback-test.h (+0/-6)
tests/unit/npapi/context-on-raise-callback-test.c (+0/-149)
tests/unit/npapi/context-on-raise-callback-test.h (+0/-6)
tests/unit/npapi/context-prepare-test.c (+0/-149)
tests/unit/npapi/context-prepare-test.h (+0/-6)
tests/unit/npapi/context-remove-application-action-test.c (+0/-125)
tests/unit/npapi/context-remove-application-action-test.h (+0/-6)
tests/unit/npapi/context-remove-application-actions-test.c (+0/-102)
tests/unit/npapi/context-remove-application-actions-test.h (+0/-6)
tests/unit/npapi/context-set-homepage-test.c (+0/-125)
tests/unit/npapi/context-set-homepage-test.h (+0/-6)
tests/unit/npapi/context-set-preview-requested-callback-test.c (+0/-149)
tests/unit/npapi/context-set-preview-requested-callback-test.h (+0/-6)
tests/unit/npapi/context-set-view-is-active-test.c (+0/-125)
tests/unit/npapi/context-set-view-is-active-test.h (+0/-6)
tests/unit/npapi/context-set-view-location-test.c (+0/-125)
tests/unit/npapi/context-set-view-location-test.h (+0/-6)
tests/unit/npapi/indicator-add-action-test.c (+0/-174)
tests/unit/npapi/indicator-add-action-test.h (+0/-6)
tests/unit/npapi/indicator-clear-indicator-test.c (+0/-125)
tests/unit/npapi/indicator-clear-indicator-test.h (+0/-6)
tests/unit/npapi/indicator-clear-indicators-test.c (+0/-102)
tests/unit/npapi/indicator-clear-indicators-test.h (+0/-6)
tests/unit/npapi/indicator-set-callback-test.c (+0/-174)
tests/unit/npapi/indicator-set-callback-test.h (+0/-6)
tests/unit/npapi/indicator-set-property-icon-test.c (+0/-174)
tests/unit/npapi/indicator-set-property-icon-test.h (+0/-6)
tests/unit/npapi/indicator-set-property-test.c (+0/-174)
tests/unit/npapi/indicator-set-property-test.h (+0/-6)
tests/unit/npapi/indicator-show-indicator-test.c (+0/-125)
tests/unit/npapi/indicator-show-indicator-test.h (+0/-6)
tests/unit/npapi/launcher-add-action-test.c (+0/-174)
tests/unit/npapi/launcher-add-action-test.h (+0/-6)
tests/unit/npapi/launcher-add-static-action-test.c (+0/-149)
tests/unit/npapi/launcher-add-static-action-test.h (+0/-6)
tests/unit/npapi/launcher-clear-count-test.c (+0/-102)
tests/unit/npapi/launcher-clear-count-test.h (+0/-6)
tests/unit/npapi/launcher-clear-progress-test.c (+0/-102)
tests/unit/npapi/launcher-clear-progress-test.h (+0/-6)
tests/unit/npapi/launcher-remove-action-test.c (+0/-125)
tests/unit/npapi/launcher-remove-action-test.h (+0/-6)
tests/unit/npapi/launcher-remove-actions-test.c (+0/-102)
tests/unit/npapi/launcher-remove-actions-test.h (+0/-6)
tests/unit/npapi/launcher-remove-static-actions-test.c (+0/-102)
tests/unit/npapi/launcher-remove-static-actions-test.h (+0/-6)
tests/unit/npapi/launcher-set-count-test.c (+0/-125)
tests/unit/npapi/launcher-set-count-test.h (+0/-6)
tests/unit/npapi/launcher-set-progress-test.c (+0/-125)
tests/unit/npapi/launcher-set-progress-test.h (+0/-6)
tests/unit/npapi/launcher-set-urgent-test.c (+0/-102)
tests/unit/npapi/launcher-set-urgent-test.h (+0/-6)
tests/unit/npapi/music-player-get-can-go-next-test.c (+0/-102)
tests/unit/npapi/music-player-get-can-go-next-test.h (+0/-6)
tests/unit/npapi/music-player-get-can-go-previous-test.c (+0/-102)
tests/unit/npapi/music-player-get-can-go-previous-test.h (+0/-6)
tests/unit/npapi/music-player-get-can-pause-test.c (+0/-102)
tests/unit/npapi/music-player-get-can-pause-test.h (+0/-6)
tests/unit/npapi/music-player-get-can-play-test.c (+0/-102)
tests/unit/npapi/music-player-get-can-play-test.h (+0/-6)
tests/unit/npapi/music-player-get-playback-state-test.c (+0/-102)
tests/unit/npapi/music-player-get-playback-state-test.h (+0/-6)
tests/unit/npapi/music-player-init-test.c (+0/-125)
tests/unit/npapi/music-player-init-test.h (+0/-6)
tests/unit/npapi/music-player-on-next-callback-test.c (+0/-149)
tests/unit/npapi/music-player-on-next-callback-test.h (+0/-6)
tests/unit/npapi/music-player-on-play-pause-callback-test.c (+0/-149)
tests/unit/npapi/music-player-on-play-pause-callback-test.h (+0/-6)
tests/unit/npapi/music-player-on-previous-callback-test.c (+0/-149)
tests/unit/npapi/music-player-on-previous-callback-test.h (+0/-6)
tests/unit/npapi/music-player-set-can-go-next-test.c (+0/-125)
tests/unit/npapi/music-player-set-can-go-next-test.h (+0/-6)
tests/unit/npapi/music-player-set-can-go-previous-test.c (+0/-125)
tests/unit/npapi/music-player-set-can-go-previous-test.h (+0/-6)
tests/unit/npapi/music-player-set-can-pause-test.c (+0/-125)
tests/unit/npapi/music-player-set-can-pause-test.h (+0/-6)
tests/unit/npapi/music-player-set-can-play-test.c (+0/-125)
tests/unit/npapi/music-player-set-can-play-test.h (+0/-6)
tests/unit/npapi/music-player-set-playback-state-test.c (+0/-125)
tests/unit/npapi/music-player-set-playback-state-test.h (+0/-6)
tests/unit/npapi/music-player-set-track-test.c (+0/-200)
tests/unit/npapi/music-player-set-track-test.h (+0/-6)
tests/unit/npapi/notification-show-notification-test.c (+0/-174)
tests/unit/npapi/notification-show-notification-test.h (+0/-6)
tests/unit/npapi/permissions-is-integration-allowed-test.c (+0/-80)
tests/unit/npapi/permissions-is-integration-allowed-test.h (+0/-6)
tests/unit/npapi/test_common.c (+0/-27)
tests/unit/npapi/test_common.h (+0/-23)
tests/unit/unit.pro (+3/-0)
unity-chromium-extension.pro (+14/-0)
To merge this branch: bzr merge lp:~webapps/unity-chromium-extension/staging2
Reviewer Review Type Date Requested Status
WebApps Pending
Review via email: mp+244966@code.launchpad.net

Commit message

Support native messaging (Justin McPherson, Alberto Mardegan)

Description of the change

Support native messaging (Justin McPherson, Alberto Mardegan)

To post a comment you must log in.
266. By David Barth

sync with latest upstream (vivid) debian changelog

267. By David Barth

add libtool dependency

268. By David Barth

revert

269. By David Barth

reset to UNRELEASED for the ci bot

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.bzrignore'
2--- .bzrignore 2012-03-16 12:42:18 +0000
3+++ .bzrignore 2015-01-19 16:40:00 +0000
4@@ -1,2 +1,23 @@
5+*.log
6+*.moc
7+*.substvars
8 Makefile
9-Makefile.in
10+Makefile.*
11+moc_*.cpp
12+/chromium-extension/build/
13+/chromium-extension/buildstamp
14+/chromium-extension/manifest.json
15+/chromium-extension/res/
16+/chromium-extension/unity-webapps/
17+/chromium-extension/unity-webapps.crx
18+/chromium-extension/unity-webapps.json
19+/chromium-extension/unity-webapps.pem
20+/debian/files
21+/debian/tmp
22+/debian/unity-chromium-extension/
23+/messaging-host/com.canonical.webapp.installer.json
24+/messaging-host/unity-webapps-messaging-host
25+/tests/unit/messaging-host/connection-host
26+/tests/unit/messaging-host/tst_connection
27+/tests/unit/messaging-host/tst_inactivity_timer
28+/tests/unit/messaging-host/tst_service
29
30=== removed file 'AUTHORS'
31=== removed file 'ChangeLog'
32=== removed file 'INSTALL'
33--- INSTALL 2012-06-02 00:56:28 +0000
34+++ INSTALL 1970-01-01 00:00:00 +0000
35@@ -1,370 +0,0 @@
36-Installation Instructions
37-*************************
38-
39-Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
40-Inc.
41-
42- Copying and distribution of this file, with or without modification,
43-are permitted in any medium without royalty provided the copyright
44-notice and this notice are preserved. This file is offered as-is,
45-without warranty of any kind.
46-
47-Basic Installation
48-==================
49-
50- Briefly, the shell commands `./configure; make; make install' should
51-configure, build, and install this package. The following
52-more-detailed instructions are generic; see the `README' file for
53-instructions specific to this package. Some packages provide this
54-`INSTALL' file but do not implement all of the features documented
55-below. The lack of an optional feature in a given package is not
56-necessarily a bug. More recommendations for GNU packages can be found
57-in *note Makefile Conventions: (standards)Makefile Conventions.
58-
59- The `configure' shell script attempts to guess correct values for
60-various system-dependent variables used during compilation. It uses
61-those values to create a `Makefile' in each directory of the package.
62-It may also create one or more `.h' files containing system-dependent
63-definitions. Finally, it creates a shell script `config.status' that
64-you can run in the future to recreate the current configuration, and a
65-file `config.log' containing compiler output (useful mainly for
66-debugging `configure').
67-
68- It can also use an optional file (typically called `config.cache'
69-and enabled with `--cache-file=config.cache' or simply `-C') that saves
70-the results of its tests to speed up reconfiguring. Caching is
71-disabled by default to prevent problems with accidental use of stale
72-cache files.
73-
74- If you need to do unusual things to compile the package, please try
75-to figure out how `configure' could check whether to do them, and mail
76-diffs or instructions to the address given in the `README' so they can
77-be considered for the next release. If you are using the cache, and at
78-some point `config.cache' contains results you don't want to keep, you
79-may remove or edit it.
80-
81- The file `configure.ac' (or `configure.in') is used to create
82-`configure' by a program called `autoconf'. You need `configure.ac' if
83-you want to change it or regenerate `configure' using a newer version
84-of `autoconf'.
85-
86- The simplest way to compile this package is:
87-
88- 1. `cd' to the directory containing the package's source code and type
89- `./configure' to configure the package for your system.
90-
91- Running `configure' might take a while. While running, it prints
92- some messages telling which features it is checking for.
93-
94- 2. Type `make' to compile the package.
95-
96- 3. Optionally, type `make check' to run any self-tests that come with
97- the package, generally using the just-built uninstalled binaries.
98-
99- 4. Type `make install' to install the programs and any data files and
100- documentation. When installing into a prefix owned by root, it is
101- recommended that the package be configured and built as a regular
102- user, and only the `make install' phase executed with root
103- privileges.
104-
105- 5. Optionally, type `make installcheck' to repeat any self-tests, but
106- this time using the binaries in their final installed location.
107- This target does not install anything. Running this target as a
108- regular user, particularly if the prior `make install' required
109- root privileges, verifies that the installation completed
110- correctly.
111-
112- 6. You can remove the program binaries and object files from the
113- source code directory by typing `make clean'. To also remove the
114- files that `configure' created (so you can compile the package for
115- a different kind of computer), type `make distclean'. There is
116- also a `make maintainer-clean' target, but that is intended mainly
117- for the package's developers. If you use it, you may have to get
118- all sorts of other programs in order to regenerate files that came
119- with the distribution.
120-
121- 7. Often, you can also type `make uninstall' to remove the installed
122- files again. In practice, not all packages have tested that
123- uninstallation works correctly, even though it is required by the
124- GNU Coding Standards.
125-
126- 8. Some packages, particularly those that use Automake, provide `make
127- distcheck', which can by used by developers to test that all other
128- targets like `make install' and `make uninstall' work correctly.
129- This target is generally not run by end users.
130-
131-Compilers and Options
132-=====================
133-
134- Some systems require unusual options for compilation or linking that
135-the `configure' script does not know about. Run `./configure --help'
136-for details on some of the pertinent environment variables.
137-
138- You can give `configure' initial values for configuration parameters
139-by setting variables in the command line or in the environment. Here
140-is an example:
141-
142- ./configure CC=c99 CFLAGS=-g LIBS=-lposix
143-
144- *Note Defining Variables::, for more details.
145-
146-Compiling For Multiple Architectures
147-====================================
148-
149- You can compile the package for more than one kind of computer at the
150-same time, by placing the object files for each architecture in their
151-own directory. To do this, you can use GNU `make'. `cd' to the
152-directory where you want the object files and executables to go and run
153-the `configure' script. `configure' automatically checks for the
154-source code in the directory that `configure' is in and in `..'. This
155-is known as a "VPATH" build.
156-
157- With a non-GNU `make', it is safer to compile the package for one
158-architecture at a time in the source code directory. After you have
159-installed the package for one architecture, use `make distclean' before
160-reconfiguring for another architecture.
161-
162- On MacOS X 10.5 and later systems, you can create libraries and
163-executables that work on multiple system types--known as "fat" or
164-"universal" binaries--by specifying multiple `-arch' options to the
165-compiler but only a single `-arch' option to the preprocessor. Like
166-this:
167-
168- ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
169- CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
170- CPP="gcc -E" CXXCPP="g++ -E"
171-
172- This is not guaranteed to produce working output in all cases, you
173-may have to build one architecture at a time and combine the results
174-using the `lipo' tool if you have problems.
175-
176-Installation Names
177-==================
178-
179- By default, `make install' installs the package's commands under
180-`/usr/local/bin', include files under `/usr/local/include', etc. You
181-can specify an installation prefix other than `/usr/local' by giving
182-`configure' the option `--prefix=PREFIX', where PREFIX must be an
183-absolute file name.
184-
185- You can specify separate installation prefixes for
186-architecture-specific files and architecture-independent files. If you
187-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
188-PREFIX as the prefix for installing programs and libraries.
189-Documentation and other data files still use the regular prefix.
190-
191- In addition, if you use an unusual directory layout you can give
192-options like `--bindir=DIR' to specify different values for particular
193-kinds of files. Run `configure --help' for a list of the directories
194-you can set and what kinds of files go in them. In general, the
195-default for these options is expressed in terms of `${prefix}', so that
196-specifying just `--prefix' will affect all of the other directory
197-specifications that were not explicitly provided.
198-
199- The most portable way to affect installation locations is to pass the
200-correct locations to `configure'; however, many packages provide one or
201-both of the following shortcuts of passing variable assignments to the
202-`make install' command line to change installation locations without
203-having to reconfigure or recompile.
204-
205- The first method involves providing an override variable for each
206-affected directory. For example, `make install
207-prefix=/alternate/directory' will choose an alternate location for all
208-directory configuration variables that were expressed in terms of
209-`${prefix}'. Any directories that were specified during `configure',
210-but not in terms of `${prefix}', must each be overridden at install
211-time for the entire installation to be relocated. The approach of
212-makefile variable overrides for each directory variable is required by
213-the GNU Coding Standards, and ideally causes no recompilation.
214-However, some platforms have known limitations with the semantics of
215-shared libraries that end up requiring recompilation when using this
216-method, particularly noticeable in packages that use GNU Libtool.
217-
218- The second method involves providing the `DESTDIR' variable. For
219-example, `make install DESTDIR=/alternate/directory' will prepend
220-`/alternate/directory' before all installation names. The approach of
221-`DESTDIR' overrides is not required by the GNU Coding Standards, and
222-does not work on platforms that have drive letters. On the other hand,
223-it does better at avoiding recompilation issues, and works well even
224-when some directory options were not specified in terms of `${prefix}'
225-at `configure' time.
226-
227-Optional Features
228-=================
229-
230- If the package supports it, you can cause programs to be installed
231-with an extra prefix or suffix on their names by giving `configure' the
232-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
233-
234- Some packages pay attention to `--enable-FEATURE' options to
235-`configure', where FEATURE indicates an optional part of the package.
236-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
237-is something like `gnu-as' or `x' (for the X Window System). The
238-`README' should mention any `--enable-' and `--with-' options that the
239-package recognizes.
240-
241- For packages that use the X Window System, `configure' can usually
242-find the X include and library files automatically, but if it doesn't,
243-you can use the `configure' options `--x-includes=DIR' and
244-`--x-libraries=DIR' to specify their locations.
245-
246- Some packages offer the ability to configure how verbose the
247-execution of `make' will be. For these packages, running `./configure
248---enable-silent-rules' sets the default to minimal output, which can be
249-overridden with `make V=1'; while running `./configure
250---disable-silent-rules' sets the default to verbose, which can be
251-overridden with `make V=0'.
252-
253-Particular systems
254-==================
255-
256- On HP-UX, the default C compiler is not ANSI C compatible. If GNU
257-CC is not installed, it is recommended to use the following options in
258-order to use an ANSI C compiler:
259-
260- ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
261-
262-and if that doesn't work, install pre-built binaries of GCC for HP-UX.
263-
264- HP-UX `make' updates targets which have the same time stamps as
265-their prerequisites, which makes it generally unusable when shipped
266-generated files such as `configure' are involved. Use GNU `make'
267-instead.
268-
269- On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
270-parse its `<wchar.h>' header file. The option `-nodtk' can be used as
271-a workaround. If GNU CC is not installed, it is therefore recommended
272-to try
273-
274- ./configure CC="cc"
275-
276-and if that doesn't work, try
277-
278- ./configure CC="cc -nodtk"
279-
280- On Solaris, don't put `/usr/ucb' early in your `PATH'. This
281-directory contains several dysfunctional programs; working variants of
282-these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
283-in your `PATH', put it _after_ `/usr/bin'.
284-
285- On Haiku, software installed for all users goes in `/boot/common',
286-not `/usr/local'. It is recommended to use the following options:
287-
288- ./configure --prefix=/boot/common
289-
290-Specifying the System Type
291-==========================
292-
293- There may be some features `configure' cannot figure out
294-automatically, but needs to determine by the type of machine the package
295-will run on. Usually, assuming the package is built to be run on the
296-_same_ architectures, `configure' can figure that out, but if it prints
297-a message saying it cannot guess the machine type, give it the
298-`--build=TYPE' option. TYPE can either be a short name for the system
299-type, such as `sun4', or a canonical name which has the form:
300-
301- CPU-COMPANY-SYSTEM
302-
303-where SYSTEM can have one of these forms:
304-
305- OS
306- KERNEL-OS
307-
308- See the file `config.sub' for the possible values of each field. If
309-`config.sub' isn't included in this package, then this package doesn't
310-need to know the machine type.
311-
312- If you are _building_ compiler tools for cross-compiling, you should
313-use the option `--target=TYPE' to select the type of system they will
314-produce code for.
315-
316- If you want to _use_ a cross compiler, that generates code for a
317-platform different from the build platform, you should specify the
318-"host" platform (i.e., that on which the generated programs will
319-eventually be run) with `--host=TYPE'.
320-
321-Sharing Defaults
322-================
323-
324- If you want to set default values for `configure' scripts to share,
325-you can create a site shell script called `config.site' that gives
326-default values for variables like `CC', `cache_file', and `prefix'.
327-`configure' looks for `PREFIX/share/config.site' if it exists, then
328-`PREFIX/etc/config.site' if it exists. Or, you can set the
329-`CONFIG_SITE' environment variable to the location of the site script.
330-A warning: not all `configure' scripts look for a site script.
331-
332-Defining Variables
333-==================
334-
335- Variables not defined in a site shell script can be set in the
336-environment passed to `configure'. However, some packages may run
337-configure again during the build, and the customized values of these
338-variables may be lost. In order to avoid this problem, you should set
339-them in the `configure' command line, using `VAR=value'. For example:
340-
341- ./configure CC=/usr/local2/bin/gcc
342-
343-causes the specified `gcc' to be used as the C compiler (unless it is
344-overridden in the site shell script).
345-
346-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
347-an Autoconf bug. Until the bug is fixed you can use this workaround:
348-
349- CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
350-
351-`configure' Invocation
352-======================
353-
354- `configure' recognizes the following options to control how it
355-operates.
356-
357-`--help'
358-`-h'
359- Print a summary of all of the options to `configure', and exit.
360-
361-`--help=short'
362-`--help=recursive'
363- Print a summary of the options unique to this package's
364- `configure', and exit. The `short' variant lists options used
365- only in the top level, while the `recursive' variant lists options
366- also present in any nested packages.
367-
368-`--version'
369-`-V'
370- Print the version of Autoconf used to generate the `configure'
371- script, and exit.
372-
373-`--cache-file=FILE'
374- Enable the cache: use and save the results of the tests in FILE,
375- traditionally `config.cache'. FILE defaults to `/dev/null' to
376- disable caching.
377-
378-`--config-cache'
379-`-C'
380- Alias for `--cache-file=config.cache'.
381-
382-`--quiet'
383-`--silent'
384-`-q'
385- Do not print messages saying which checks are being made. To
386- suppress all normal output, redirect it to `/dev/null' (any error
387- messages will still be shown).
388-
389-`--srcdir=DIR'
390- Look for the package's source code in directory DIR. Usually
391- `configure' can determine that directory automatically.
392-
393-`--prefix=DIR'
394- Use DIR as the installation prefix. *note Installation Names::
395- for more details, including other options available for fine-tuning
396- the installation locations.
397-
398-`--no-create'
399-`-n'
400- Run the configure checks, but stop before creating any output
401- files.
402-
403-`configure' also accepts some other, not widely useful, options. Run
404-`configure --help' for more details.
405-
406
407=== removed file 'Makefile.am'
408--- Makefile.am 2012-10-01 23:03:21 +0000
409+++ Makefile.am 1970-01-01 00:00:00 +0000
410@@ -1,9 +0,0 @@
411-SUBDIRS = npapi-plugin chromium-extension tests po
412-
413-CLEANFILES = unity-webapps.pem
414-
415-DISTCHECK_CONFIGURE_FLAGS=--enable-tests=yes
416-
417-EXTRA_DIST = autogen.sh
418-
419-include $(top_srcdir)/Makefile.am.coverage
420
421=== removed file 'Makefile.am.coverage'
422--- Makefile.am.coverage 2012-11-29 17:44:47 +0000
423+++ Makefile.am.coverage 1970-01-01 00:00:00 +0000
424@@ -1,32 +0,0 @@
425-
426-# Coverage targets
427-
428-if HAVE_GCOV
429-
430-.PHONY: clean-gcda
431-clean-gcda:
432- @echo Removing old coverage results
433- -find -name '*.gcda' -print | xargs -r rm
434-
435-.PHONY: coverage-html generate-coverage-html clean-coverage-html
436-coverage-html: clean-gcda
437- -$(MAKE) $(AM_MAKEFLAGS) -k check
438- $(MAKE) $(AM_MAKEFLAGS) generate-coverage-html
439-
440-coverage-xml: clean-gcda
441- -$(MAKE) $(AM_MAKEFLAGS) -k check
442- gcovr --xml -r $(top_builddir) -o "$(top_builddir)/coverage.xml" --exclude='.*tests.*'
443-
444-generate-coverage-html:
445- @echo Collecting coverage data
446- $(LCOV) --directory $(top_builddir) --capture --output-file coverage.info --no-checksum --compat-libtool
447- $(LCOV) --extract coverage.info "`pwd`/npapi-plugin/src/*" --output-file coverage-src.info
448- LANG=C $(GENHTML) --prefix $(top_builddir) --output-directory coverage-html --title "Code Coverage" --legend --show-details coverage-src.info
449-
450-clean-coverage-html: clean-gcda
451- -$(LCOV) --directory $(top_builddir) -z
452- -rm -rf coverage.info coverage-src.info coverage-html
453-
454-clean-local: clean-coverage-html
455-
456-endif # HAVE_GCOV
457
458=== removed file 'NEWS'
459=== removed file 'README'
460--- README 2012-11-14 20:26:07 +0000
461+++ README 1970-01-01 00:00:00 +0000
462@@ -1,1 +0,0 @@
463-+
464\ No newline at end of file
465
466=== removed file 'autogen.sh'
467--- autogen.sh 2012-03-08 15:11:24 +0000
468+++ autogen.sh 1970-01-01 00:00:00 +0000
469@@ -1,157 +0,0 @@
470-#!/bin/sh
471-# Run this to generate all the initial makefiles, etc.
472-
473-srcdir=`dirname $0`
474-test -z "$srcdir" && srcdir=.
475-
476-DIE=0
477-
478-if [ -n "$GNOME2_DIR" ]; then
479- ACLOCAL_FLAGS="-I $GNOME2_DIR/share/aclocal $ACLOCAL_FLAGS"
480- LD_LIBRARY_PATH="$GNOME2_DIR/lib:$LD_LIBRARY_PATH"
481- PATH="$GNOME2_DIR/bin:$PATH"
482- export PATH
483- export LD_LIBRARY_PATH
484-fi
485-
486-(test -f $srcdir/configure.ac) || {
487- echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
488- echo " top-level package directory"
489- exit 1
490-}
491-
492-(autoconf --version) < /dev/null > /dev/null 2>&1 || {
493- echo
494- echo "**Error**: You must have \`autoconf' installed."
495- echo "Download the appropriate package for your distribution,"
496- echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
497- DIE=1
498-}
499-
500-(grep "^IT_PROG_INTLTOOL" $srcdir/configure.ac >/dev/null) && {
501- (intltoolize --version) < /dev/null > /dev/null 2>&1 || {
502- echo
503- echo "**Error**: You must have \`intltool' installed."
504- echo "You can get it from:"
505- echo " ftp://ftp.gnome.org/pub/GNOME/"
506- DIE=1
507- }
508-}
509-
510-(grep "^AM_PROG_XML_I18N_TOOLS" $srcdir/configure.ac >/dev/null) && {
511- (xml-i18n-toolize --version) < /dev/null > /dev/null 2>&1 || {
512- echo
513- echo "**Error**: You must have \`xml-i18n-toolize' installed."
514- echo "You can get it from:"
515- echo " ftp://ftp.gnome.org/pub/GNOME/"
516- DIE=1
517- }
518-}
519-
520-(grep "^LT_INIT" $srcdir/configure.ac >/dev/null) && {
521- (libtool --version) < /dev/null > /dev/null 2>&1 || {
522- echo
523- echo "**Error**: You must have \`libtool' installed."
524- echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/"
525- DIE=1
526- }
527-}
528-
529-(grep "^AM_GLIB_GNU_GETTEXT" $srcdir/configure.ac >/dev/null) && {
530- (grep "sed.*POTFILES" $srcdir/configure.ac) > /dev/null || \
531- (glib-gettextize --version) < /dev/null > /dev/null 2>&1 || {
532- echo
533- echo "**Error**: You must have \`glib' installed."
534- echo "You can get it from: ftp://ftp.gtk.org/pub/gtk"
535- DIE=1
536- }
537-}
538-
539-(automake --version) < /dev/null > /dev/null 2>&1 || {
540- echo
541- echo "**Error**: You must have \`automake' installed."
542- echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/"
543- DIE=1
544- NO_AUTOMAKE=yes
545-}
546-
547-
548-# if no automake, don't bother testing for aclocal
549-test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || {
550- echo
551- echo "**Error**: Missing \`aclocal'. The version of \`automake'"
552- echo "installed doesn't appear recent enough."
553- echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/"
554- DIE=1
555-}
556-
557-if test "$DIE" -eq 1; then
558- exit 1
559-fi
560-
561-if test -z "$*"; then
562- echo "**Warning**: I am going to run \`configure' with no arguments."
563- echo "If you wish to pass any to it, please specify them on the"
564- echo \`$0\'" command line."
565- echo
566-fi
567-
568-case $CC in
569-xlc )
570- am_opt=--include-deps;;
571-esac
572-
573-for coin in `find $srcdir -path $srcdir/CVS -prune -o -name configure.ac -print`
574-do
575- dr=`dirname $coin`
576- if test -f $dr/NO-AUTO-GEN; then
577- echo skipping $dr -- flagged as no auto-gen
578- else
579- echo processing $dr
580- ( cd $dr
581-
582- aclocalinclude="$ACLOCAL_FLAGS"
583-
584- if grep "^AM_GLIB_GNU_GETTEXT" configure.ac >/dev/null; then
585- echo "Creating $dr/aclocal.m4 ..."
586- test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
587- echo "Running glib-gettextize... Ignore non-fatal messages."
588- echo "no" | glib-gettextize --force --copy
589- echo "Making $dr/aclocal.m4 writable ..."
590- test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
591- fi
592- if grep "^IT_PROG_INTLTOOL" configure.ac >/dev/null; then
593- echo "Running intltoolize..."
594- intltoolize --copy --force --automake
595- fi
596- if grep "^AM_PROG_XML_I18N_TOOLS" configure.ac >/dev/null; then
597- echo "Running xml-i18n-toolize..."
598- xml-i18n-toolize --copy --force --automake
599- fi
600- if grep "^LT_INIT" configure.ac >/dev/null; then
601- if test -z "$NO_LIBTOOLIZE" ; then
602- echo "Running libtoolize..."
603- libtoolize --force --copy
604- fi
605- fi
606- echo "Running aclocal $aclocalinclude ..."
607- aclocal $aclocalinclude
608- if grep "^A[CM]_CONFIG_HEADER" configure.ac >/dev/null; then
609- echo "Running autoheader..."
610- autoheader
611- fi
612- echo "Running automake --gnu $am_opt ..."
613- automake --add-missing --gnu $am_opt
614- echo "Running autoconf ..."
615- autoconf
616- )
617- fi
618-done
619-
620-if test x$NOCONFIGURE = x; then
621- echo Running $srcdir/configure "$@" ...
622- $srcdir/configure "$@" \
623- && echo Now type \`make\' to compile. || exit 1
624-else
625- echo Skipping configure process.
626-fi
627
628=== removed file 'chromium-extension/Makefile.am'
629--- chromium-extension/Makefile.am 2013-12-16 07:15:32 +0000
630+++ chromium-extension/Makefile.am 1970-01-01 00:00:00 +0000
631@@ -1,44 +0,0 @@
632-CLEANFILES = res/*
633-EXTRA_DIST =
634-
635-extensiondir = $(libdir)/libunity-chromium
636-extension_DATA=res/unity-webapps.crx
637-
638-
639-clean-extension-package:
640- rm -f $(CLEANFILES)
641-
642-SCRIPT_FILES = \
643- $(shell ls *.css) \
644- $(shell ls *.html) \
645- $(shell ls *.js) \
646- $(shell ls skin/*) \
647- $(shell ls _locales/*/*)
648-
649-res/unity-webapps.crx: $(SCRIPT_FILES) unity-webapps.json manifest.json
650- cp -f $(top_builddir)/npapi-plugin/src/.libs/libunity_npapi_plugin.so .
651- if [ ! -f ../unity-webapps.pem ]; \
652- then \
653- openssl genrsa 1024 > ../unity-webapps.pem; \
654- fi
655- $(srcdir)/crxmake.sh $(abs_builddir) ../unity-webapps.pem
656- mv res/chromium-extension.crx res/unity-webapps.crx
657-
658-manifestdir = $(datadir)/chromium/extensions/
659-manifest_DATA = $(shell ls $(top_builddir)/chromium-extension/res/*.json)
660-
661-%.json: %.json.in
662- sed -e "s|\@EXTDIR\@|$(extensiondir)/unity-webapps.crx|" $< | sed -e "s|\@VERSION\@|$(VERSION)|"> $@
663-
664-
665-CLEANFILES += \
666- unity-webapps.json \
667- manifest.json \
668- libunity_npapi_plugin.so \
669- chromium-extension.crx
670-
671-EXTRA_DIST += \
672- unity-webapps.json.in \
673- manifest.json.in \
674- crxmake.sh \
675- $(SCRIPT_FILES)
676
677=== added file 'chromium-extension/background-page.html'
678--- chromium-extension/background-page.html 1970-01-01 00:00:00 +0000
679+++ chromium-extension/background-page.html 2015-01-19 16:40:00 +0000
680@@ -0,0 +1,15 @@
681+<!doctype html>
682+<html>
683+ <head>
684+
685+ <title>Unity Webapps Extension Background Page</title>
686+ <embed type="application/x-unity-webapps-npapi" id="unityChromiumExtensionId"/>
687+
688+ <script src="background-page.js"></script>
689+
690+ </head>
691+
692+ <body>
693+ </body>
694+
695+</html>
696
697=== removed file 'chromium-extension/background-page.html'
698--- chromium-extension/background-page.html 2012-11-09 17:28:56 +0000
699+++ chromium-extension/background-page.html 1970-01-01 00:00:00 +0000
700@@ -1,15 +0,0 @@
701-<!doctype html>
702-<html>
703- <head>
704-
705- <title>Unity Webapps Extension Background Page</title>
706- <embed type="application/x-unity-webapps-npapi" id="unityChromiumExtensionId"/>
707-
708- <script src="background-page.js"></script>
709-
710- </head>
711-
712- <body>
713- </body>
714-
715-</html>
716
717=== modified file 'chromium-extension/background-page.js'
718--- chromium-extension/background-page.js 2014-02-20 00:33:36 +0000
719+++ chromium-extension/background-page.js 2015-01-19 16:40:00 +0000
720@@ -6,7 +6,7 @@
721 * under the terms of the GNU General Public License version 3, as published
722 * by the Free Software Foundation.
723 *
724- * This program is distributed in the hope that it will be useful, but
725+ * This program is distributed in the hope that it will be useful, but
726 * WITHOUT ANY WARRANTY; without even the implied warranties of
727 * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
728 * PURPOSE. See the GNU General Public License for more details.
729@@ -16,440 +16,259 @@
730 **/
731
732 var background_page = (function () {
733-
734- // TODO extract based on logging settings
735- var log = {
736- info: function (msg) {
737- if (msg) {
738- console.log ('Info: ' + msg);
739- }
740- }
741- ,
742- error: function (msg) {
743- if (msg) {
744- console.log ('Error: ' + msg);
745- }
746- }
747- };
748-
749- // connection & init w/ plugin NPAPI layer
750- var plugin = document.getElementById ('unityChromiumExtensionId');
751- if ( ! plugin) {
752- log.error ("Unable to retrieve the Unity Chromium plugin");
753- return null;
754- }
755- var service = plugin.service_new ();
756- if (! service) {
757- log.error ("Unable to retrieve a connection to Unity Webapps service");
758- return null;
759- }
760-
761-
762- /////////////////////////////////////////////////////////
763- //
764- // Handle login & connection to online-accounts project's
765- // extension
766- //
767- ////////////////////////////////////////////////////////
768- var loginListeners = [];
769- var onLoginListenerRequest = function (request, sender, sendResponse) {
770- if (request.action == "registerLoginListener") {
771- log.info ("Login listener request from " + sender.id);
772- loginListeners.push (sender.id);
773- }
774- };
775- chrome.runtime.onMessageExternal.addListener (onLoginListenerRequest);
776-
777- var onLoginEvent = function (request, sender, sendResponse) {
778- if (request.action == "loginEvent") {
779- log.info ("Login on " + request.domain + ": " + request.login);
780- var len = loginListeners.length;
781- for (var i = 0; i < len; i++) {
782- var extensionId = loginListeners[i];
783- log.info("Notifying login listener: " + extensionId);
784- chrome.runtime.sendMessage (extensionId, {
785- type: "login",
786- login: request.login,
787- domain: request.domain
788- });
789- }
790- }
791- };
792- chrome.runtime.onMessage.addListener (onLoginEvent);
793-
794-
795- /////////////////////////////////////////////////////////
796- //
797- // Scafolding to keep track of data associated w/ infobar requests
798- // (Chromium's structure imposes some kind of state being maintained
799- // in order to communicate data)
800- //
801- ////////////////////////////////////////////////////////
802- //
803- // list of callback that are to be called asynchronously
804- // per tab. Used in the user integration/installation resquests context.
805- //
806- // One thing to keep in mind is that one constraint, that bring some amount of
807- // 'soundness' is that there is a hard limit (provided by the browser) of one infobar per tab.
808-
809- var user_infobar_request_callbacks = {};
810- var addInfobarRequestCallbackFor = function (infobarRequestId, callback, message, details) {
811- user_infobar_request_callbacks[infobarRequestId] = {callback: callback
812- , message: message
813- , details: details
814- };
815- };
816- var getDataIfAnyFor = function (infobarRequestId) {
817- if (user_infobar_request_callbacks[infobarRequestId] === undefined) {
818- return "";
819- }
820- return { message: user_infobar_request_callbacks[infobarRequestId].message,
821- details: user_infobar_request_callbacks[infobarRequestId].details };
822- };
823- var invokeAndRemoveCallbackIfAnyFor = function (infobarRequestId, arguments) {
824- if (user_infobar_request_callbacks[infobarRequestId] === undefined) {
825- return;
826- }
827- var callback = user_infobar_request_callbacks[infobarRequestId].callback;
828- user_infobar_request_callbacks[infobarRequestId] = undefined;
829- if (typeof(callback) === 'function') {
830- callback(arguments);
831- }
832- };
833-
834-
835- /////////////////////////////////////////////////////////
836- //
837- // Extract installed userscripts & webapps info
838- //
839- ////////////////////////////////////////////////////////
840- var initializeIntegrationScriptRepositoryAccess = function (plugin) {
841-
842- var repo = plugin.application_repository_new_default ();
843- plugin.application_repository_prepare (repo);
844- return repo;
845- };
846- var repo_ = initializeIntegrationScriptRepositoryAccess(plugin);
847- var repo_install_request_stamps = {};
848-
849- /**
850- * Performs a match on the list of loaded integration scripts
851- * given a url.
852- *
853- */
854- var matchesIntegrationScripts = function (plugin, url, repo, windowInfos, callback) {
855- function askForApplicationInstallation(plugin, appPackageName, appDomain, url, installationCallback) {
856-
857- if (plugin.permissions_get_domain_dontask(appDomain)) {
858- log.info ("WebApp domain was found in the 'dont ask' list, won't install: " + appPackageName);
859- installationCallback ();
860- return;
861- }
862- if (repo_install_request_stamps[appPackageName] !== undefined) {
863- log.info ('WebApp not being considered for install (request is only issues once per session): ' + appPackageName);
864- installationCallback ();
865- return;
866- }
867- repo_install_request_stamps[appPackageName] = true;
868-
869- function installApp() {
870- log.info ('Installing application: ' + appPackageName);
871- plugin.permissions_allow_domain(appDomain);
872- plugin.application_repository_install_application(repo, appPackageName, installationCallback, null);
873- }
874- function addToIgnoreList() {
875- plugin.permissions_dontask_domain(appDomain);
876- }
877- var isInstallationConfirmed = function (response) {
878- return response && response.integrate;
879- };
880-
881- if (!plugin.permissions_get_domain_preauthorized(appDomain)) {
882- var appName = plugin.application_repository_get_resolved_application_name(repo, appPackageName);
883- addInfobarRequestCallbackFor (windowInfos.tabId,
884- function (result) {
885- log.info ('Asking for installation : ' + windowInfos.tabId);
886- if (result === undefined) {
887- installationCallback();
888- }
889- if (isInstallationConfirmed(result))
890- installApp();
891- else
892- addToIgnoreList();
893- },
894- chrome.i18n.getMessage("integration_copy", [appName, appDomain]),
895- null);
896- chrome.infobars.show ({tabId: windowInfos.tabId, path: "infobar.html"});
897- }
898- else {
899- plugin.permissions_allow_domain(appDomain);
900- installApp();
901- }
902-
903- } // function askForApplicationInstallation
904-
905- var APPLICATION_STATUS_AVAILABLE = 0;
906- var APPLICATION_STATUS_INSTALLED = 1;
907- var APPLICATION_STATUS_UNRESOLVED = 2;
908-
909- var formatMatchedWebAppInfo = function (packageName, appName, appDomain, src) {
910- return {
911- packageName: packageName,
912- appName: appName,
913- appDomain: appDomain,
914- content: src,
915- requires: null,
916- includes: null
917- };
918- };
919-
920- /**
921- * Gathers the lists of installed and (if any) available apps for a given list of app names
922- * (available for a given url).
923- *
924- * @returns object with "installed" and "available" list properties
925- */
926- var gatherApplicationsStatuses = function (packageNames) {
927- var installed = [];
928- var available = [];
929- for (var i = 0; i < packageNames.length; ++i) {
930- var packageName = packageNames[i];
931-
932- var status = plugin.application_repository_get_resolved_application_status (repo, packageName);
933- var appName = plugin.application_repository_get_resolved_application_name (repo, packageName);
934- var appDomain = plugin.application_repository_get_resolved_application_domain (repo, packageName);
935-
936- log.info ('A WebApp application has been found: ' + appName + ', status: ' + status);
937-
938- switch (status) {
939- case APPLICATION_STATUS_INSTALLED:
940- // we have found an installed application, use it directly
941- var src = plugin.application_repository_get_userscript_contents (repo, packageName);
942- installed.push (formatMatchedWebAppInfo(packageName, appName, appDomain, src));
943- break;
944- case APPLICATION_STATUS_AVAILABLE:
945- // we have found an application that can apply and be installed
946- available.push (formatMatchedWebAppInfo(packageName, appName, appDomain));
947- break;
948- }
949- }
950- return {
951- installed: installed,
952- available: available
953- };
954- };
955-
956- var packageNames = JSON.parse(plugin.application_repository_resolve_url_as_json(repo_, url));
957- if (null != packageNames) {
958- var appStatuses = gatherApplicationsStatuses(packageNames);
959-
960- if (appStatuses && appStatuses.installed && appStatuses.installed.length > 0) {
961- var app = appStatuses.installed[0];
962- if (repo_install_request_stamps[app.packageName] == undefined
963- && ! plugin.permissions_get_domain_dontask(app.appDomain)
964- && ! plugin.permissions_get_domain_allowed(app.appDomain)) {
965- // requesting for install
966- addInfobarRequestCallbackFor (windowInfos.tabId,
967- function (result) {
968- if (result && result.integrate) {
969- plugin.application_repository_add_desktop_to_launcher(app.appName, app.appDomain);
970- plugin.permissions_allow_domain(app.appDomain);
971- }
972- else {
973- plugin.permissions_dontask_domain(app.appDomain);
974- }
975- },
976- chrome.i18n.getMessage("integration_copy", [app.appName, app.appDomain]),
977- null);
978- chrome.infobars.show ({tabId: windowInfos.tabId, path: "infobar.html"});
979- }
980- return;
981- }
982-
983- // we should have at most one script for a given app
984- if (appStatuses && appStatuses.available && appStatuses.available.length > 0) {
985- var app = appStatuses.available[0];
986- askForApplicationInstallation (plugin,
987- app.packageName,
988- app.appDomain,
989- url,
990- function (_repository, name, status, data) {
991- log.info ('Application installed: ' + name + ', (status ' + status + ')');
992-
993- if (name !== undefined && status == APPLICATION_STATUS_INSTALLED) {
994- callback (true, app.packageName, app.appName, app.appDomain);
995- }
996- }
997- );
998- }
999- else
1000- callback (false);
1001- } // if (null != names) {
1002-
1003- }; // var matchesIntegrationScripts = function (plugin, url, repo, windowInfos, callback) {
1004-
1005-
1006- ////////////////////////////////////////
1007- //
1008- // main request handler
1009- //
1010- ///////////////////////////////////////
1011+ // Native messaging support
1012+ var HOST_ADDRESS = 'com.canonical.webapp.installer';
1013+ var port = null;
1014+ var host_callbacks = [];
1015+
1016+ var portListener = function (msg) {
1017+ callback = host_callbacks.pop();
1018+ if (callback === undefined) {
1019+ return;
1020+ }
1021+ callback(msg);
1022+ };
1023+
1024+ var portDisconnecter = function () {
1025+ console.log('UCX: port disconnected');
1026+ port = null
1027+ };
1028+
1029+ var sendNativeMessage = function (msg, callback) {
1030+ console.log("UCX: sendnativemessage: port=" + port);
1031+ if (port === null) {
1032+ port = chrome.runtime.connectNative(HOST_ADDRESS);
1033+ port.onMessage.addListener(portListener);
1034+ port.onDisconnect.addListener(portDisconnecter);
1035+ }
1036+ host_callbacks.push(callback || function(m) {});
1037+ port.postMessage(msg);
1038+ };
1039+
1040+ // Wake server to catalogue webapps
1041+ sendNativeMessage({"method":"ping"});
1042+
1043+
1044+ /////////////////////////////////////////////////////////
1045+ //
1046+ // Scafolding to keep track of data associated w/ infobar requests
1047+ // (Chromium's structure imposes some kind of state being maintained
1048+ // in order to communicate data)
1049+ //
1050+ ////////////////////////////////////////////////////////
1051+ //
1052+ // list of callback that are to be called asynchronously
1053+ // per tab. Used in the user integration/installation resquests context.
1054+ //
1055+ // One thing to keep in mind is that one constraint, that bring some amount of
1056+ // 'soundness' is that there is a hard limit (provided by the browser) of one infobar per tab.
1057+
1058+ var user_infobar_request_callbacks = {};
1059+ var addInfobarRequestCallbackFor = function (infobarRequestId, callback, message, details) {
1060+ user_infobar_request_callbacks[infobarRequestId] = {
1061+ callback: callback,
1062+ message: message,
1063+ details: details
1064+ };
1065+ };
1066+
1067+ var getDataIfAnyFor = function (infobarRequestId) {
1068+ if (user_infobar_request_callbacks[infobarRequestId] === undefined) {
1069+ return "";
1070+ }
1071+ return {
1072+ message: user_infobar_request_callbacks[infobarRequestId].message,
1073+ details: user_infobar_request_callbacks[infobarRequestId].details
1074+ };
1075+ };
1076+
1077+ var invokeAndRemoveCallbackIfAnyFor = function (infobarRequestId, arguments) {
1078+ if (user_infobar_request_callbacks[infobarRequestId] === undefined) {
1079+ return;
1080+ }
1081+ var callback = user_infobar_request_callbacks[infobarRequestId].callback;
1082+ user_infobar_request_callbacks[infobarRequestId] = undefined;
1083+ if (typeof(callback) === 'function') {
1084+ callback(arguments);
1085+ }
1086+ };
1087+
1088+
1089+ /**
1090+ * Performs a match on the list of loaded integration scripts
1091+ * given a url.
1092+ *
1093+ */
1094+ var matchesIntegrationScripts = function (plugin, url, repo, windowInfos, callback) {
1095+ sendNativeMessage({
1096+ "method" : "url_loaded",
1097+ "url" : url
1098+ },
1099+ function (response) {
1100+ if (response.available) {
1101+ addInfobarRequestCallbackFor(
1102+ windowInfos.tabId,
1103+ function (result) {
1104+ if (result && result.integrate) {
1105+ sendNativeMessage({
1106+ "method" : "install",
1107+ "url" : url
1108+ })
1109+ } else {
1110+ sendNativeMessage({
1111+ "method" : "dont_ask",
1112+ "url" : url
1113+ })
1114+ }
1115+ },
1116+ chrome.i18n.getMessage("integration_copy", [ response.appName, response.appDomain ]),
1117+ null);
1118+
1119+ chrome.infobars.show({ tabId: windowInfos.tabId, path: "infobar.html" });
1120+ }
1121+ });
1122+ };
1123+
1124+
1125+ // {{{ main request handler
1126
1127 /**
1128 * Handles & responds to content script requests.
1129 *
1130 */
1131- var init_requested_stamps = {};
1132- var contentScriptsRequestHandler = function (request, sender, callback) {
1133-
1134- var handlers = {
1135- get_extension_settings: function (request, sender, callback) {
1136-
1137- var settings = {
1138- logging: false,
1139- incognito: sender.tab.incognito
1140- };
1141-
1142- try {
1143- if (window.localStorage) {
1144- settings.logging = localStorage['logging'];
1145- }
1146- }
1147- catch (e) {
1148- log.error ("Error while trying to retrieve logging information: " + str(e));
1149- }
1150-
1151- callback (settings);
1152- }
1153- ,
1154- on_user_infobar_request_result: function (request, sender, callback) {
1155-
1156- invokeAndRemoveCallbackIfAnyFor (request.tabId, request);
1157- }
1158- ,
1159- init_requested: function (request, sender, callback) {
1160- var name = request.options.name;
1161- var domain = request.options.domain;
1162- var iconUrl = request.options.iconUrl + '';
1163- var homepage = request.options.homepage || request.options.url;
1164-
1165- if (! domain || ! name || typeof(domain) !== 'string' || typeof(name) !== 'string')
1166- return;
1167-
1168- var islocal = request.options.protocol && request.options.protocol === 'file:';
1169- var host = request.options.hostname || request.options.host;
1170- if ( ! islocal && (! host || typeof(host) !== 'string'))
1171- return;
1172-
1173- if (-1 === homepage.indexOf(domain) || -1 === host.indexOf(domain)) {
1174- log.error('Invalid call to init(), homepage, domain and host are not consistent');
1175- return;
1176- }
1177- log.info('init_requested() called for ' + name + ' domain: ' + domain);
1178-
1179- if (plugin.permissions_get_domain_dontask(domain) || plugin.permissions_get_domain_allowed(domain)) {
1180- log.info('Domain already listed in allow or dont ask lists');
1181- return;
1182- }
1183-
1184- var stampname = name + domain;
1185- if (init_requested_stamps[stampname] == undefined) {
1186- addInfobarRequestCallbackFor (sender.tab.id,
1187- function (result) {
1188- if (result && result.integrate) {
1189- plugin.application_repository_generate_desktop_for_url_launch(name, domain, homepage, iconUrl);
1190- plugin.application_repository_add_desktop_to_launcher(name, domain);
1191- plugin.permissions_allow_domain(domain);
1192- }
1193- else {
1194- plugin.permissions_dontask_domain(domain);
1195- }
1196- },
1197- chrome.i18n.getMessage("integration_copy", [name, domain]),
1198- null);
1199- init_requested_stamps[stampname] = true;
1200- chrome.infobars.show ({tabId: sender.tab.id, path: "infobar.html"});
1201- }
1202- }
1203- }; // handlers
1204-
1205-
1206- // validate request
1207- if ( ! request || ! request.method) {
1208- callback ({error: "Invalid request structure"});
1209- return true;
1210- }
1211- if ( ! sender) {
1212- callback ({error: "Invalid sender"});
1213- return true;
1214- }
1215- if ( typeof (request.method) != 'string' || request.method.length == 0) {
1216- callback ({error: "Invalid request method"});
1217- return true;
1218- }
1219-
1220- log.info ('Got request: ' + request.method);
1221-
1222- var handler = handlers [request.method];
1223-
1224- if (handler !== undefined && typeof(handler) == 'function') {
1225-
1226- log.info ('Calling handler for: ' + request.method);
1227-
1228- handler (request, sender, callback);
1229-
1230- return true;
1231- }
1232- return false;
1233- } // var contentScriptsRequestHandler =
1234-
1235- // Main event handler and communication link
1236- // w/ content scripts
1237- chrome.runtime.onMessage.addListener (contentScriptsRequestHandler);
1238-
1239-
1240- ///////////////////////////////////////////////////////////////////////
1241- //
1242- // Window management related functions. In chromeless mode, we have specific
1243- // rules for tab management to make webapps feel more "native" than plain
1244- // web applications.
1245- //
1246- ///////////////////////////////////////////////////////////////////////
1247-
1248- var onTabChanged = function (tabId, windowId, url) {
1249- var onInstalled = function (installed, packageName, appName, appDomain) { };
1250- matchesIntegrationScripts (plugin,
1251- url,
1252- repo_,
1253- {
1254- windowId: windowId,
1255- tabId: tabId
1256- },
1257- onInstalled
1258- );
1259- };
1260- chrome.tabs.onCreated.addListener(
1261- function(tab) {
1262- if (tab && tab.url) {
1263- onTabChanged(tab.id, tab.windowId, tab.url);
1264- } // if (tab && tab.url) {
1265- }
1266- );
1267- chrome.tabs.onUpdated.addListener (
1268- function(tabId, changeInfo, tab) {
1269- if (changeInfo && changeInfo.url) {
1270- onTabChanged(tabId, tab.windowId, changeInfo.url);
1271- }
1272- }
1273- );
1274-
1275- return {
1276- /*
1277- * Returns a potential message associated with a tab id (infobar)
1278- */
1279- getMessageForTabId: function (tabId) {
1280- return getDataIfAnyFor (tabId).message;
1281- }
1282- };
1283- }) ();
1284+ var init_requested_stamps = {};
1285+ var contentScriptsRequestHandler = function (request, sender, callback) {
1286+ var handlers = {
1287+ get_extension_settings: function (request, sender, callback) {
1288+ var settings = {
1289+ logging: false,
1290+ incognito: sender.tab.incognito
1291+ };
1292+
1293+ try {
1294+ if (window.localStorage) {
1295+ settings.logging = localStorage['logging'];
1296+ }
1297+ }
1298+ catch (e) {
1299+ console.log("Error while trying to retrieve logging information: " + str(e));
1300+ }
1301+
1302+ callback (settings);
1303+ },
1304+ on_user_infobar_request_result: function (request, sender, callback) {
1305+ invokeAndRemoveCallbackIfAnyFor (request.tabId, request);
1306+ },
1307+ init_requested: function (request, sender, callback) {
1308+ sendNativeMessage({
1309+ "method" : "url_loaded",
1310+ "url" : request.options.url
1311+ },
1312+ function (response) {
1313+ if (response.available) {
1314+ addInfobarRequestCallbackFor(
1315+ sender.tab.id,
1316+ function (result) {
1317+ if (result && result.integrate) {
1318+ sendNativeMessage({
1319+ "method" : "install",
1320+ "url" : request.options.url
1321+ })
1322+ } else {
1323+ sendNativeMessage({
1324+ "method" : "dont_ask",
1325+ "url" : request.options.url
1326+ })
1327+ }
1328+ },
1329+ chrome.i18n.getMessage("integration_copy", [ response.appName, response.appDomain ]),
1330+ null);
1331+
1332+ chrome.infobars.show({ tabId: windowInfos.tabId, path: "infobar.html" });
1333+ }
1334+ });
1335+ }
1336+ };
1337+
1338+ // validate request
1339+ if (!request || !request.method) {
1340+ callback({ error: "Invalid request structure" });
1341+ return true;
1342+ }
1343+ if (!sender) {
1344+ callback({ error: "Invalid sender" });
1345+ return true;
1346+ }
1347+
1348+ if (typeof(request.method) != 'string' || request.method.length == 0) {
1349+ callback({ error: "Invalid request method" });
1350+ return true;
1351+ }
1352+
1353+ console.log('Got request: ' + request.method);
1354+
1355+ var handler = handlers [request.method];
1356+ if (handler !== undefined && typeof(handler) == 'function') {
1357+ handler(request, sender, callback);
1358+ return true;
1359+ }
1360+ return false;
1361+ }
1362+
1363+ // Main event handler and communication link
1364+ // w/ content scripts
1365+ chrome.runtime.onMessage.addListener (contentScriptsRequestHandler);
1366+ // }}}
1367+
1368+ ///////////////////////////////////////////////////////////////////////
1369+ //
1370+ // Window management related functions. In chromeless mode, we have specific
1371+ // rules for tab management to make webapps feel more "native" than plain
1372+ // web applications.
1373+ //
1374+ ///////////////////////////////////////////////////////////////////////
1375+
1376+ var onTabChanged = function (tabId, windowId, url) {
1377+ var onInstalled = function (installed, packageName, appName, appDomain) { };
1378+
1379+ console.log("onTabChanged: " + url);
1380+
1381+ matchesIntegrationScripts(
1382+ null, //plugin,
1383+ url,
1384+ null, // repo_,
1385+ {
1386+ windowId: windowId,
1387+ tabId: tabId
1388+ },
1389+ onInstalled
1390+ );
1391+ };
1392+
1393+ chrome.tabs.onCreated.addListener(
1394+ function(tab) {
1395+ if (tab && tab.url) {
1396+ onTabChanged(tab.id, tab.windowId, tab.url);
1397+ }
1398+ }
1399+ );
1400+
1401+ chrome.tabs.onUpdated.addListener(
1402+ function(tabId, changeInfo, tab) {
1403+ console.log("onUpdated " + changeInfo.url);
1404+ if (changeInfo && changeInfo.url) {
1405+ onTabChanged(tabId, tab.windowId, changeInfo.url);
1406+ }
1407+ }
1408+ );
1409+
1410+ /*
1411+ * Returns a potential message associated with a tab id (infobar)
1412+ */
1413+ return {
1414+ getMessageForTabId: function (tabId) {
1415+ return getDataIfAnyFor(tabId).message;
1416+ }
1417+ };
1418+})();
1419
1420
1421=== modified file 'chromium-extension/base-content-script.js'
1422--- chromium-extension/base-content-script.js 2013-12-16 07:15:32 +0000
1423+++ chromium-extension/base-content-script.js 2015-01-19 16:40:00 +0000
1424@@ -6,7 +6,7 @@
1425 * under the terms of the GNU General Public License version 3, as published
1426 * by the Free Software Foundation.
1427 *
1428- * This program is distributed in the hope that it will be useful, but
1429+ * This program is distributed in the hope that it will be useful, but
1430 * WITHOUT ANY WARRANTY; without even the implied warranties of
1431 * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1432 * PURPOSE. See the GNU General Public License for more details.
1433
1434=== added file 'chromium-extension/browser.js'
1435--- chromium-extension/browser.js 1970-01-01 00:00:00 +0000
1436+++ chromium-extension/browser.js 2015-01-19 16:40:00 +0000
1437@@ -0,0 +1,154 @@
1438+/**
1439+ * Handles all the related work to injecting the 'external' extension into the
1440+ * content script (well, more precisely the current environment), and the proxy
1441+ * responsbile for handling the API requests in a webapplication.
1442+ *
1443+ */
1444+(function (currentWindow) {
1445+ var aWindow = currentWindow;
1446+ var plugin = null;
1447+ var service = null;
1448+ var api = {
1449+ init: function (options) {
1450+ options.url = window.location.href;
1451+ options.hostname = window.location.hostname;
1452+ options.host = window.location.host;
1453+ options.protocol = window.location.protocol;
1454+ chrome.runtime.sendMessage (
1455+ {method: "init_requested", options: options}
1456+ , function (response) {});
1457+ }
1458+ };
1459+
1460+ /**
1461+ * Inserts a given script in the webpage.
1462+ * Needs chrome.extension functionality.
1463+ *
1464+ * @param path of file to be injected (part of the extension)
1465+ */
1466+ var insertScriptIntoWebpage = function (path) {
1467+ var script = document.createElement ('script');
1468+ script.type = 'text/javascript';
1469+ script.src = chrome.runtime.getURL (path);
1470+ document.getElementsByTagName("head")[0].appendChild (script);
1471+ };
1472+
1473+ var injectApiProxy = function () {
1474+
1475+ // 1. inject a piece of javascript proxying all the requests
1476+ // to the unity webapps api
1477+ insertScriptIntoWebpage('unity-api-page-proxy-builder-gen.js');
1478+ insertScriptIntoWebpage('unity-api-page-proxy.js');
1479+
1480+ function makeWebpageCallback (id) {
1481+ // TODO/FIXME: add support for callback params (needed for DnD)
1482+ return function () {
1483+ var d = document.createElement ("textarea");
1484+ var e = document.createEvent ("Events");
1485+ d.style.cssText = "display:none;";
1486+ d.value = id;
1487+ d.addEventListener ("unity-webapps-chromium-api-com-link-callback-called-ack"
1488+ , function() { d.parentNode.removeChild (d); }
1489+ , true);
1490+ document.body.appendChild (d);
1491+ e.initEvent ("unity-webapps-chromium-api-com-link-callback-called", false, true);
1492+ d.dispatchEvent (e);
1493+ };
1494+ };
1495+
1496+ // TODO: should be shared / generated w/ web page code
1497+ var isIterableObject = function(obj) {
1498+ if (obj === undefined || obj === null) {
1499+ return false;
1500+ }
1501+ var t = typeof(obj);
1502+ var types = {'string': 0, 'function': 0, 'number': 0, 'undefined': 0, 'boolean': 0};
1503+ return types[t] === undefined;
1504+ };
1505+
1506+ /**
1507+ * Wraps callback ids in proper callback that dispatch to the
1508+ * webpage thru a proper event
1509+ *
1510+ */
1511+ function wrapCallbackIds (obj) {
1512+ if ( ! isIterableObject(obj)) {
1513+ return obj;
1514+ }
1515+ if (obj
1516+ && obj.hasOwnProperty('callbackid')
1517+ && obj.callbackid != null) {
1518+ return makeWebpageCallback (obj.callbackid);
1519+ }
1520+
1521+ var ret = (obj instanceof Array) ? [] : {};
1522+ for (var key in obj) {
1523+ if (obj.hasOwnProperty(key)) {
1524+
1525+ if (isIterableObject (obj[key])) {
1526+
1527+ if (obj[key].callbackid != null) {
1528+ ret[key] = makeWebpageCallback (obj[key].callbackid);
1529+ }
1530+ else {
1531+ ret[key] = wrapCallbackIds (obj[key]);
1532+ }
1533+ }
1534+ else {
1535+ ret[key] = obj[key];
1536+ }
1537+ }
1538+ }
1539+ return ret;
1540+ };
1541+
1542+ // 2. open the communication mean between the two
1543+
1544+ // TODO has the implicit knowledge of who's behind ...
1545+ var dispatchActualFunctionCall = function (funcname, args) {
1546+ var funcnames = funcname.split('.');
1547+ var reducetarget = api;
1548+
1549+ // a bit hacky
1550+ try {
1551+ // Assumes that we are calling a 'callable' from a succession of objects
1552+ funcnames.reduce (
1553+ function (prev, cur) {
1554+ return typeof prev[cur] == "function" ? prev[cur].bind(prev) : prev[cur];
1555+ }, reducetarget).apply (null, args);
1556+ } catch (err) {
1557+ console.log ('Error while dispatching call to ' + funcnames.join('.') + ': ' + err);
1558+ }
1559+ };
1560+
1561+ document.addEventListener("unity-webapps-chromium-api-com-link"
1562+ , function(event) {
1563+ var from = event.target;
1564+ if (from) {
1565+ var type = from.getAttribute("data-eventType");
1566+
1567+ var args = JSON.parse(from.value);
1568+ args = args.map (function (arg) { return wrapCallbackIds (arg); });
1569+
1570+ // Actuall call, e.g. 'Notification.showNotification("a","b")
1571+ // being reduces to successive calls to associated objects:
1572+ // Notification, showNotification
1573+ //
1574+ // TODO add proper error handling
1575+ dispatchActualFunctionCall(type, args);
1576+ }
1577+
1578+ // send ack event to allow cleanup
1579+ var ret = document.createEvent('Events');
1580+ ret.initEvent('unity-webapps-chromium-api-com-link-ack', true, false);
1581+ from.dispatchEvent(ret);
1582+ }
1583+ , true);
1584+ };
1585+
1586+ // handle the proxy side of the api which is being injected on the
1587+ // webpage
1588+ injectApiProxy();
1589+ }
1590+)(window);
1591+
1592
1593=== removed file 'chromium-extension/browser.js'
1594--- chromium-extension/browser.js 2013-12-16 07:15:32 +0000
1595+++ chromium-extension/browser.js 1970-01-01 00:00:00 +0000
1596@@ -1,154 +0,0 @@
1597-/**
1598- * Handles all the related work to injecting the 'external' extension into the
1599- * content script (well, more precisely the current environment), and the proxy
1600- * responsbile for handling the API requests in a webapplication.
1601- *
1602- */
1603-(function (currentWindow) {
1604- var aWindow = currentWindow;
1605- var plugin = null;
1606- var service = null;
1607- var api = {
1608- init: function (options) {
1609- options.url = window.location.href;
1610- options.hostname = window.location.hostname;
1611- options.host = window.location.host;
1612- options.protocol = window.location.protocol;
1613- chrome.runtime.sendMessage (
1614- {method: "init_requested", options: options}
1615- , function (response) {});
1616- }
1617- };
1618-
1619- /**
1620- * Inserts a given script in the webpage.
1621- * Needs chrome.extension functionality.
1622- *
1623- * @param path of file to be injected (part of the extension)
1624- */
1625- var insertScriptIntoWebpage = function (path) {
1626- var script = document.createElement ('script');
1627- script.type = 'text/javascript';
1628- script.src = chrome.runtime.getURL (path);
1629- document.getElementsByTagName("head")[0].appendChild (script);
1630- };
1631-
1632- var injectApiProxy = function () {
1633-
1634- // 1. inject a piece of javascript proxying all the requests
1635- // to the unity webapps api
1636- insertScriptIntoWebpage('unity-api-page-proxy-builder-gen.js');
1637- insertScriptIntoWebpage('unity-api-page-proxy.js');
1638-
1639- function makeWebpageCallback (id) {
1640- // TODO/FIXME: add support for callback params (needed for DnD)
1641- return function () {
1642- var d = document.createElement ("textarea");
1643- var e = document.createEvent ("Events");
1644- d.style.cssText = "display:none;";
1645- d.value = id;
1646- d.addEventListener ("unity-webapps-chromium-api-com-link-callback-called-ack"
1647- , function() { d.parentNode.removeChild (d); }
1648- , true);
1649- document.body.appendChild (d);
1650- e.initEvent ("unity-webapps-chromium-api-com-link-callback-called", false, true);
1651- d.dispatchEvent (e);
1652- };
1653- };
1654-
1655- // TODO: should be shared / generated w/ web page code
1656- var isIterableObject = function(obj) {
1657- if (obj === undefined || obj === null) {
1658- return false;
1659- }
1660- var t = typeof(obj);
1661- var types = {'string': 0, 'function': 0, 'number': 0, 'undefined': 0, 'boolean': 0};
1662- return types[t] === undefined;
1663- };
1664-
1665- /**
1666- * Wraps callback ids in proper callback that dispatch to the
1667- * webpage thru a proper event
1668- *
1669- */
1670- function wrapCallbackIds (obj) {
1671- if ( ! isIterableObject(obj)) {
1672- return obj;
1673- }
1674- if (obj
1675- && obj.hasOwnProperty('callbackid')
1676- && obj.callbackid != null) {
1677- return makeWebpageCallback (obj.callbackid);
1678- }
1679-
1680- var ret = (obj instanceof Array) ? [] : {};
1681- for (var key in obj) {
1682- if (obj.hasOwnProperty(key)) {
1683-
1684- if (isIterableObject (obj[key])) {
1685-
1686- if (obj[key].callbackid != null) {
1687- ret[key] = makeWebpageCallback (obj[key].callbackid);
1688- }
1689- else {
1690- ret[key] = wrapCallbackIds (obj[key]);
1691- }
1692- }
1693- else {
1694- ret[key] = obj[key];
1695- }
1696- }
1697- }
1698- return ret;
1699- };
1700-
1701- // 2. open the communication mean between the two
1702-
1703- // TODO has the implicit knowledge of who's behind ...
1704- var dispatchActualFunctionCall = function (funcname, args) {
1705- var funcnames = funcname.split('.');
1706- var reducetarget = api;
1707-
1708- // a bit hacky
1709- try {
1710- // Assumes that we are calling a 'callable' from a succession of objects
1711- funcnames.reduce (
1712- function (prev, cur) {
1713- return typeof prev[cur] == "function" ? prev[cur].bind(prev) : prev[cur];
1714- }, reducetarget).apply (null, args);
1715- } catch (err) {
1716- console.log ('Error while dispatching call to ' + funcnames.join('.') + ': ' + err);
1717- }
1718- };
1719-
1720- document.addEventListener("unity-webapps-chromium-api-com-link"
1721- , function(event) {
1722- var from = event.target;
1723- if (from) {
1724- var type = from.getAttribute("data-eventType");
1725-
1726- var args = JSON.parse(from.value);
1727- args = args.map (function (arg) { return wrapCallbackIds (arg); });
1728-
1729- // Actuall call, e.g. 'Notification.showNotification("a","b")
1730- // being reduces to successive calls to associated objects:
1731- // Notification, showNotification
1732- //
1733- // TODO add proper error handling
1734- dispatchActualFunctionCall(type, args);
1735- }
1736-
1737- // send ack event to allow cleanup
1738- var ret = document.createEvent('Events');
1739- ret.initEvent('unity-webapps-chromium-api-com-link-ack', true, false);
1740- from.dispatchEvent(ret);
1741- }
1742- , true);
1743- };
1744-
1745- // handle the proxy side of the api which is being injected on the
1746- // webpage
1747- injectApiProxy();
1748- }
1749-)(window);
1750-
1751
1752=== added file 'chromium-extension/chromium-extension.pro'
1753--- chromium-extension/chromium-extension.pro 1970-01-01 00:00:00 +0000
1754+++ chromium-extension/chromium-extension.pro 2015-01-19 16:40:00 +0000
1755@@ -0,0 +1,66 @@
1756+include(../common-project-config.pri)
1757+include($${TOP_SRC_DIR}/common-vars.pri)
1758+
1759+TEMPLATE = aux
1760+
1761+EXTENSION_DIR = $${INSTALL_LIBDIR}/libunity-chromium
1762+EXTENSION_NAME = unity-webapps
1763+EXTENSION_FILE = $${EXTENSION_NAME}.crx
1764+
1765+STATIC_EXTENSION_FILES = \
1766+ background-page.html \
1767+ background-page.js \
1768+ base-content-script.js \
1769+ browser.js \
1770+ infobar.css \
1771+ infobar.html \
1772+ infobar.js \
1773+ _locales \
1774+ options.html \
1775+ options.js \
1776+ skin \
1777+ unity-api-page-proxy-builder-gen.js \
1778+ unity-api-page-proxy.js \
1779+
1780+SCRIPT_FILES = \
1781+ $${STATIC_EXTENSION_FILES} \
1782+ manifest.json \
1783+ unity-webapps.json
1784+
1785+QMAKE_SUBSTITUTES += \
1786+ manifest.json.in \
1787+ unity-webapps.json.in
1788+
1789+pemfile.target = unity-webapps.pem
1790+pemfile.commands = "openssl genrsa 1024 > $${pemfile.target}"
1791+
1792+static_files.depends = \
1793+ $${SCRIPT_FILES}
1794+static_files.commands = mkdir -p $${OUT_PWD}/$${EXTENSION_NAME} && ${COPY_DIR} $${SCRIPT_FILES} $${OUT_PWD}/$${EXTENSION_NAME}
1795+
1796+static_files_stamp.target = buildstamp
1797+static_files_stamp.depends = static_files
1798+static_files_stamp.commands = touch $${static_files_stamp.target}
1799+
1800+extension.target = res/$${EXTENSION_NAME}.crx
1801+extension.commands = $${TOP_SRC_DIR}/chromium-extension/crxmake.sh $${OUT_PWD}/$${EXTENSION_NAME} $${pemfile.target}
1802+extension.depends = pemfile static_files_stamp
1803+
1804+QMAKE_EXTRA_TARGETS += \
1805+ extension \
1806+ pemfile \
1807+ static_files \
1808+ static_files_stamp
1809+
1810+PRE_TARGETDEPS = $${extension.target}
1811+
1812+manifest.files = \
1813+ $${OUT_PWD}/res/*.json
1814+manifest.path = $${INSTALL_PREFIX}/share/chromium/extensions/
1815+manifest.CONFIG = no_check_exist
1816+INSTALLS += manifest
1817+
1818+crx.files = res/$${EXTENSION_NAME}.crx
1819+crx.path = $${EXTENSION_DIR}
1820+crx.CONFIG = no_check_exist
1821+INSTALLS += crx
1822
1823=== modified file 'chromium-extension/infobar.js'
1824--- chromium-extension/infobar.js 2013-07-10 18:12:23 +0000
1825+++ chromium-extension/infobar.js 2015-01-19 16:40:00 +0000
1826@@ -1,29 +1,33 @@
1827 var doIntegrate = function (integrate) {
1828- chrome.tabs.getCurrent (function (tab) {
1829- chrome.runtime.sendMessage ({tabId: tab.id, method: "on_user_infobar_request_result", integrate: integrate}
1830- , function (response) {});
1831+ chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
1832+ chrome.runtime.sendMessage({tabId: tabs[0].id, method: "on_user_infobar_request_result", integrate: integrate}
1833+ , function (response) {});
1834 window.close();
1835 });
1836 };
1837
1838 window.onload = function () {
1839 chrome.runtime.getBackgroundPage(function (bg) {
1840- document.getElementById('notintegrate').onclick = function () { doIntegrate(false); };
1841- document.getElementById('integrate').onclick = function () { doIntegrate(true); };
1842+ document.getElementById('notintegrate').onclick = function () { doIntegrate(false); };
1843+ document.getElementById('integrate').onclick = function () { doIntegrate(true); };
1844
1845- chrome.tabs.getCurrent (function (tab) {
1846- if (!bg|| !bg.background_page) {
1847- window.close();
1848- return;
1849- }
1850- var msg = bg.background_page.getMessageForTabId(tab.id);
1851- if (msg == null) {
1852- window.close();
1853- return;
1854- }
1855- document.getElementById ('content').style.display = "block";
1856- document.getElementById ('message').innerHTML = msg || "";
1857- });
1858+ chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
1859+ if (tabs.length === 0) {
1860+ window.close();
1861+ return;
1862+ }
1863+ if (!bg || !bg.background_page) {
1864+ window.close();
1865+ return;
1866+ }
1867+ var msg = bg.background_page.getMessageForTabId(tabs[0].id);
1868+ if (msg == null) {
1869+ window.close();
1870+ return;
1871+ }
1872+ document.getElementById ('content').style.display = "block";
1873+ document.getElementById ('message').innerHTML = msg || "";
1874+ });
1875 });
1876 };
1877
1878
1879=== modified file 'chromium-extension/manifest.json.in'
1880--- chromium-extension/manifest.json.in 2013-12-16 07:15:32 +0000
1881+++ chromium-extension/manifest.json.in 2015-01-19 16:40:00 +0000
1882@@ -1,51 +1,41 @@
1883 {
1884- "name": "Unity WebApps Chromium extension",
1885- "manifest_version": 2,
1886- "minimum_chrome_version": "20.0",
1887- "content_security_policy": "script-src 'self' chrome-extension://infobar.js 'unsafe-eval'; object-src 'self'",
1888-
1889- "version": "@VERSION@",
1890-
1891- "description": "Unity Webapps Chromium integration",
1892-
1893- "web_accessible_resources": [
1894- "browser.js",
1895- "unity-api-page-proxy-builder-gen.js",
1896- "unity-api-page-proxy.js",
1897- "infobar.js",
1898- "options.js"
1899+ '"name": "Unity WebApps Chromium extension"',
1900+ '"manifest_version"': 2,
1901+ '"minimum_chrome_version": "34.0"',
1902+ '"content_security_policy"': '"script-src \'self\' chrome-extension://infobar.js \'unsafe-eval\'; object-src \'self\'"',
1903+
1904+ '"version": "$${PROJECT_VERSION}"',
1905+
1906+ '"description": "Unity Webapps Chromium integration"',
1907+
1908+ '"web_accessible_resources"': [
1909+ '"browser.js"',
1910+ '"unity-api-page-proxy-builder-gen.js"',
1911+ '"unity-api-page-proxy.js"',
1912+ '"infobar.js"',
1913+ '"options.js"'
1914 ],
1915
1916- "icons": {
1917- "16": "skin/cof-16.png",
1918- "48": "skin/cof-48.png"
1919- },
1920-
1921- "default_locale": "en",
1922-
1923- "background": {
1924- "page": "background-page.html"
1925+ '"icons"': {
1926+ '"16": "skin/cof-16.png"',
1927+ '"48": "skin/cof-48.png"'
1928+ },
1929+
1930+ '"default_locale": "en"',
1931+
1932+ '"background"': {
1933+ '"page"': '"background-page.html"'
1934 },
1935
1936- "permissions": ["tabs", "http://*/*", "infobars"],
1937- "options_page": "options.html",
1938+ '"permissions": ["tabs", "http://*/*", "infobars", "nativeMessaging"]',
1939+ '"options_page": "options.html"',
1940
1941- "plugins": [
1942-
1943- /** The "path" property specifies the path to your plugin, relative to the manifest file.
1944- * The "public" property specifies whether your plugin can be accessed by regular web pages;
1945- * the default is false, meaning only your extension can load the plugin.
1946- */
1947- { "path": "libunity_npapi_plugin.so", "public": false }
1948-
1949- ],
1950-
1951- "content_scripts": [
1952+ '"content_scripts"': [
1953 {
1954- "all_frames": true,
1955- "matches": [ "<all_urls>" ],
1956- "js": ["base-content-script.js"],
1957- "run_at": "document_end"
1958+ '"all_frames"': true,
1959+ '"matches": [ "<all_urls>" ]',
1960+ '"js": ["base-content-script.js"]',
1961+ '"run_at": "document_end"'
1962 }
1963 ]
1964 }
1965
1966=== added file 'chromium-extension/unity-api-page-proxy-builder-gen.js'
1967--- chromium-extension/unity-api-page-proxy-builder-gen.js 1970-01-01 00:00:00 +0000
1968+++ chromium-extension/unity-api-page-proxy-builder-gen.js 2015-01-19 16:40:00 +0000
1969@@ -0,0 +1,384 @@
1970+var UnityWebappsApiPageProxyBuilder = function(backend) {
1971+
1972+ var dummy = true;
1973+ var unity = { context: dummy, contextReady: dummy };
1974+ var uwa = { ContextActionCallbackType: null };
1975+
1976+ var CallbackManager = {
1977+ makeCallback: function (dumd, func) {
1978+ return func;
1979+ }
1980+ };
1981+
1982+ function checkString(str, allowUndef) {
1983+ if (allowUndef && str == undefined) {
1984+ return;
1985+ }
1986+ if (!str || typeof(str) !== 'string') {
1987+ throw new TypeError("incorrect argument");
1988+ }
1989+ }
1990+
1991+ var findName = function (func, prefix, obj) {
1992+
1993+ if (!prefix) {
1994+ return findName(func, 'Unity.', api);
1995+ }
1996+ var keys = Object.keys(obj);
1997+ for (var i = 0; i < keys.length; i++) {
1998+ if (typeof(keys[i]) !== 'string') {
1999+ continue;
2000+ }
2001+ var descr = Object.getOwnPropertyDescriptor(obj, keys[i]);
2002+ if (descr.value === func) {
2003+ return prefix + keys[i];
2004+ }
2005+ if (descr.value instanceof Object) {
2006+ var res = findName(func, prefix + keys[i] + '.', obj[keys[i]]);
2007+ if (res)
2008+ return res;
2009+ }
2010+ if (obj.__lookupGetter__(keys[i]) === func) {
2011+ return prefix + keys[i];
2012+ }
2013+ if (obj.__lookupSetter__(keys[i]) === func) {
2014+ return prefix + keys[i];
2015+ }
2016+ }
2017+ return null;
2018+
2019+ };
2020+
2021+
2022+ var stringify = function (obj) {
2023+
2024+ if (obj === undefined)
2025+ return obj;
2026+ if (obj === null)
2027+ return obj;
2028+ if (typeof(obj) == 'string')
2029+ return obj;
2030+ if (typeof(obj) == 'number')
2031+ return obj;
2032+ if (typeof(obj) == 'function')
2033+ return String(obj);
2034+ var dump = {};
2035+ for (var i in obj) {
2036+ if (obj.hasOwnProperty(i))
2037+ dump[i] = stringify(obj[i]);
2038+ }
2039+ return dump;
2040+
2041+ };
2042+
2043+
2044+ var stringifyArgs = function (obj) {
2045+
2046+ var args = [];
2047+ for (var i = 0; i < obj.length; i++) {
2048+ args.push(stringify(obj[i]));
2049+ }
2050+ var res = JSON.stringify(args);
2051+ return res.substr(1, res.length - 2);
2052+ };
2053+
2054+ var createArgumentsSanitaizer = function (func, argsDesc, callback) {
2055+
2056+ return function () {
2057+ var realArgs = arguments;
2058+ var name = findName(arguments.callee);
2059+
2060+ var k = 0;
2061+ function argumentSanitaizer(desc, arg) {
2062+ if (!desc) {
2063+ throw new InternalError("argument description is null");
2064+ }
2065+ if (desc.dummy) {
2066+ k--;
2067+ return null;
2068+ }
2069+ if (desc.array) {
2070+ if (!(desc.array instanceof Object) || !(desc.array.element instanceof Object)) {
2071+ throw new InternalError("invalid argument description");
2072+ }
2073+
2074+ try {
2075+ for (var j = 0; j < arg.length; j++) {
2076+ argumentSanitaizer(desc.array.element, arg[j]);
2077+ }
2078+ } catch (x) {
2079+ throw new TypeError("incorrect argument");
2080+ }
2081+
2082+ return arg;
2083+ }
2084+ if (desc.obj) {
2085+ if (!(desc.obj instanceof Object)) {
2086+ throw new InternalError("invalid argument description");
2087+ }
2088+ var res = {}, i;
2089+ for (i in desc.obj) {
2090+ if (desc.obj.hasOwnProperty(i)) {
2091+ res[i] = argumentSanitaizer(desc.obj[i], arg[i]);
2092+ }
2093+ }
2094+ return res;
2095+ }
2096+ if (desc.str) {
2097+ if (desc.allowNull && !arg) {
2098+ return null;
2099+ }
2100+ checkString(arg, false);
2101+ return arg;
2102+ }
2103+ if (desc.number) {
2104+ if (typeof(arg) !== 'number' && typeof(arg) !== 'boolean')
2105+ throw new TypeError("incorrect argument");
2106+ return arg;
2107+ }
2108+ if (!desc.type) {
2109+ throw new InternalError("argument description miss required parameter");
2110+ }
2111+ if ((arg instanceof desc.type) || (desc.type === Function && ((typeof arg) === 'function'))
2112+ || (arg === null && desc.allowNull)) {
2113+ if (desc.type === Function) {
2114+ if (!arg) {
2115+ return null;
2116+ }
2117+
2118+ var id;
2119+ if (desc.argAsCallbackId !== undefined) {
2120+ id = realArgs[desc.argAsCallbackId];
2121+ }
2122+ return CallbackManager.makeCallback(uwa.ContextActionCallbackType,
2123+ function (context, user_data) {
2124+ arg();
2125+ }, name, id);
2126+ }
2127+ return arg;
2128+ } else {
2129+ throw new TypeError("incorrect argument");
2130+ }
2131+ throw new InternalError("unreacheable");
2132+ }
2133+ var args = [unity.context], i;
2134+ for (i = 0; i < argsDesc.length; i++) {
2135+ if (k >= realArgs.length && k > 0 && !argsDesc[i].dummy) {
2136+ throw new Error("not enough arguments");
2137+ }
2138+ var value = argumentSanitaizer(argsDesc[i], realArgs[k]);
2139+ k++;
2140+
2141+ if (argsDesc[i].obj) {
2142+ args = args.concat(value);
2143+ } else {
2144+ args.push(value);
2145+ }
2146+ }
2147+
2148+ if (k < realArgs.length) {
2149+ throw new Error("too much arguments");
2150+ }
2151+
2152+ if (callback)
2153+ callback.apply(uwa, args);
2154+ if (func)
2155+ return Function.apply.apply(func, [uwa, args]);
2156+
2157+ return null;
2158+ };
2159+
2160+ };
2161+ var api = {
2162+ init: function(props) {
2163+ checkString(props.name, false);
2164+ checkString(props.iconUrl, true);
2165+ checkString(props.domain, true);
2166+ checkString(props.login, true);
2167+ checkString(props.mimeTypes, true);
2168+ checkString(props.homepage, true);
2169+ if (props.homepage && !/^(http|https|file):\/\//.test(props.homepage)) {
2170+ throw new TypeError("incorrect argument");
2171+ }
2172+ backend("init", [props]);
2173+ }
2174+ ,
2175+ acceptData: createArgumentsSanitaizer(null,
2176+ [{ array: { element: { str: true } } }, { type: Function, js: true }],
2177+ function (context, mimeTypes, callback) {
2178+ backend('acceptData', [mimeTypes, callback]);
2179+ })
2180+ ,
2181+ addAction: createArgumentsSanitaizer(null,
2182+ [{ str: true }, { type: Function, argAsCallbackId: 0 }],
2183+ function (context, name, callback) {
2184+ backend('addAction', [name, callback]);
2185+ })
2186+ ,
2187+ clearAction: createArgumentsSanitaizer(null,
2188+ [{ str: true }]
2189+ , function (context, name) {
2190+ backend('clearAction', [name]);
2191+ })
2192+ ,
2193+ clearActions: createArgumentsSanitaizer(null,
2194+ [],
2195+ function (context) {
2196+ backend('clearActions', []);
2197+ })
2198+ ,
2199+ MediaPlayer: {
2200+ init: createArgumentsSanitaizer(null,
2201+ [{ str: true }],
2202+ function (context, name) {
2203+ backend('MediaPlayer.init', [name]);
2204+ })
2205+ ,
2206+ onPlayPause: createArgumentsSanitaizer(null,
2207+ [{ type: Function, allowNull: true }, { dummy: true }],
2208+ function (context, callback) {
2209+ backend('MediaPlayer.onPlayPause', [callback]);
2210+ }
2211+ )
2212+ ,
2213+ onPrevious: createArgumentsSanitaizer(null,
2214+ [{ type: Function, allowNull: true }, { dummy: true }],
2215+ function (context, callback) {
2216+ backend('MediaPlayer.onPrevious', [callback]);
2217+ })
2218+ ,
2219+ onNext: createArgumentsSanitaizer(null,
2220+ [{ type: Function, allowNull: true }, { dummy: true }],
2221+ function (context, callback) {
2222+ backend('MediaPlayer.onNext', [callback]);
2223+ }
2224+ )
2225+ ,
2226+ setTrack: createArgumentsSanitaizer(null,
2227+ [{ obj: { artist: { str: true, place: 0, allowNull: true },
2228+ album: { str: true, place: 1, allowNull: true },
2229+ title: { str: true, place: 2 },
2230+ artLocation: { str: true, place: 3, allowNull: true } } }],
2231+ function (context, trackinfos) {
2232+ backend('MediaPlayer.setTrack', [trackinfos]);
2233+ })
2234+ ,
2235+ setCanGoNext: createArgumentsSanitaizer(null,
2236+ [{ number: true }],
2237+ function (context, v) {
2238+ backend('MediaPlayer.setCanGoNext', [v]);
2239+ }
2240+ )
2241+ ,
2242+ setCanGoPrevious: createArgumentsSanitaizer(null,
2243+ [{ number: true }],
2244+ function (context, v) {
2245+ backend('MediaPlayer.setCanGoPrevious', [v]);
2246+ }
2247+ )
2248+ ,
2249+ setCanPlay: createArgumentsSanitaizer(null,
2250+ [{ number: true }],
2251+ function (context, v) { backend('MediaPlayer.setCanPlay', [v]); }
2252+ )
2253+ ,
2254+ setCanPause: createArgumentsSanitaizer(null,
2255+ [{ number: true }],
2256+ function (context, v) { backend('MediaPlayer.setCanPause', [v]); }
2257+ )
2258+ ,
2259+ setPlaybackState: createArgumentsSanitaizer(null,
2260+ [{ number: true }],
2261+ function (context, v) { backend('MediaPlayer.setPlaybackState', [v]); }
2262+ )
2263+ ,
2264+ getPlaybackState: createArgumentsSanitaizer(null
2265+ , [{ type: Function }]
2266+ , function (context, callback) {
2267+ backend('MediaPlayer.getPlaybackState', [callback]);
2268+ }
2269+ )
2270+ ,
2271+ PlaybackState: {PLAYING: 0, PAUSED:1}
2272+ },
2273+
2274+ Notification: {
2275+ showNotification: createArgumentsSanitaizer(null,
2276+ [{ str: true }, { str: true }, { str: true, allowNull: true }],
2277+ function (context, title, name, dummy) {
2278+ backend('Notification.showNotification', [title, name, dummy]);
2279+ }
2280+ )
2281+ },
2282+
2283+ Launcher: {
2284+ setCount: createArgumentsSanitaizer(null,
2285+ [{ number: true }],
2286+ function (context, count) {
2287+ backend('Launcher.setCount', [count]);
2288+ }
2289+ )
2290+ ,
2291+ clearCount: createArgumentsSanitaizer(null,
2292+ [],
2293+ function (context) {
2294+ backend('Launcher.clearCount', []);
2295+ }),
2296+ setProgress: createArgumentsSanitaizer(null,
2297+ [{ number: true }],
2298+ function (context, progress) {
2299+ backend('Launcher.setProgress', [progress]);
2300+ }
2301+ )
2302+ ,
2303+ clearProgress: createArgumentsSanitaizer(null,
2304+ [],
2305+ function (context) {
2306+ backend('Launcher.clearProgress', []);
2307+ }
2308+ )
2309+ ,
2310+ setUrgent: createArgumentsSanitaizer(null,
2311+ [],
2312+ function (context) {
2313+ backend('Launcher.setUrgent', []);
2314+ }
2315+ )
2316+ ,
2317+ addAction: function(arg1, arg2) {
2318+ backend('Launcher.addAction', [arg1, arg2]);
2319+ }
2320+ ,
2321+ removeAction: createArgumentsSanitaizer(null,
2322+ [{ str: true }],
2323+ function (context, name) {
2324+ backend('Launcher.removeAction', [name]);
2325+ }
2326+ )
2327+ ,
2328+ removeActions: createArgumentsSanitaizer(null,
2329+ [],
2330+ function (context) {
2331+ backend('Launcher.removeActions', []);
2332+ }
2333+ )
2334+ },
2335+ MessagingIndicator: {
2336+ addAction: createArgumentsSanitaizer(null,
2337+ [{ str: true }, { type: Function, argAsCallbackId: 0 }, { dummy: true }],
2338+ function (context, name, callback, dummy) {
2339+ backend('MessagingIndicator.addAction', [name, callback, dummy]);
2340+ }
2341+ )
2342+ ,
2343+ showIndicator: function(name, properties) {
2344+ backend('MessagingIndicator.showIndicator', [name, properties]);
2345+ }
2346+ ,
2347+ clearIndicator: createArgumentsSanitaizer(null, [{ str: true }], function(context, name) { backend('MessagingIndicator.clearIndicator', [name]); }),
2348+ clearIndicators: createArgumentsSanitaizer(null, [], function (context) { backend('MessagingIndicator.clearIndicators', []); })
2349+ }
2350+ };
2351+ return api;
2352+};
2353+
2354
2355=== removed file 'chromium-extension/unity-api-page-proxy-builder-gen.js'
2356--- chromium-extension/unity-api-page-proxy-builder-gen.js 2013-11-01 06:37:07 +0000
2357+++ chromium-extension/unity-api-page-proxy-builder-gen.js 1970-01-01 00:00:00 +0000
2358@@ -1,384 +0,0 @@
2359-var UnityWebappsApiPageProxyBuilder = function(backend) {
2360-
2361- var dummy = true;
2362- var unity = { context: dummy, contextReady: dummy };
2363- var uwa = { ContextActionCallbackType: null };
2364-
2365- var CallbackManager = {
2366- makeCallback: function (dumd, func) {
2367- return func;
2368- }
2369- };
2370-
2371- function checkString(str, allowUndef) {
2372- if (allowUndef && str == undefined) {
2373- return;
2374- }
2375- if (!str || typeof(str) !== 'string') {
2376- throw new TypeError("incorrect argument");
2377- }
2378- }
2379-
2380- var findName = function (func, prefix, obj) {
2381-
2382- if (!prefix) {
2383- return findName(func, 'Unity.', api);
2384- }
2385- var keys = Object.keys(obj);
2386- for (var i = 0; i < keys.length; i++) {
2387- if (typeof(keys[i]) !== 'string') {
2388- continue;
2389- }
2390- var descr = Object.getOwnPropertyDescriptor(obj, keys[i]);
2391- if (descr.value === func) {
2392- return prefix + keys[i];
2393- }
2394- if (descr.value instanceof Object) {
2395- var res = findName(func, prefix + keys[i] + '.', obj[keys[i]]);
2396- if (res)
2397- return res;
2398- }
2399- if (obj.__lookupGetter__(keys[i]) === func) {
2400- return prefix + keys[i];
2401- }
2402- if (obj.__lookupSetter__(keys[i]) === func) {
2403- return prefix + keys[i];
2404- }
2405- }
2406- return null;
2407-
2408- };
2409-
2410-
2411- var stringify = function (obj) {
2412-
2413- if (obj === undefined)
2414- return obj;
2415- if (obj === null)
2416- return obj;
2417- if (typeof(obj) == 'string')
2418- return obj;
2419- if (typeof(obj) == 'number')
2420- return obj;
2421- if (typeof(obj) == 'function')
2422- return String(obj);
2423- var dump = {};
2424- for (var i in obj) {
2425- if (obj.hasOwnProperty(i))
2426- dump[i] = stringify(obj[i]);
2427- }
2428- return dump;
2429-
2430- };
2431-
2432-
2433- var stringifyArgs = function (obj) {
2434-
2435- var args = [];
2436- for (var i = 0; i < obj.length; i++) {
2437- args.push(stringify(obj[i]));
2438- }
2439- var res = JSON.stringify(args);
2440- return res.substr(1, res.length - 2);
2441- };
2442-
2443- var createArgumentsSanitaizer = function (func, argsDesc, callback) {
2444-
2445- return function () {
2446- var realArgs = arguments;
2447- var name = findName(arguments.callee);
2448-
2449- var k = 0;
2450- function argumentSanitaizer(desc, arg) {
2451- if (!desc) {
2452- throw new InternalError("argument description is null");
2453- }
2454- if (desc.dummy) {
2455- k--;
2456- return null;
2457- }
2458- if (desc.array) {
2459- if (!(desc.array instanceof Object) || !(desc.array.element instanceof Object)) {
2460- throw new InternalError("invalid argument description");
2461- }
2462-
2463- try {
2464- for (var j = 0; j < arg.length; j++) {
2465- argumentSanitaizer(desc.array.element, arg[j]);
2466- }
2467- } catch (x) {
2468- throw new TypeError("incorrect argument");
2469- }
2470-
2471- return arg;
2472- }
2473- if (desc.obj) {
2474- if (!(desc.obj instanceof Object)) {
2475- throw new InternalError("invalid argument description");
2476- }
2477- var res = {}, i;
2478- for (i in desc.obj) {
2479- if (desc.obj.hasOwnProperty(i)) {
2480- res[i] = argumentSanitaizer(desc.obj[i], arg[i]);
2481- }
2482- }
2483- return res;
2484- }
2485- if (desc.str) {
2486- if (desc.allowNull && !arg) {
2487- return null;
2488- }
2489- checkString(arg, false);
2490- return arg;
2491- }
2492- if (desc.number) {
2493- if (typeof(arg) !== 'number' && typeof(arg) !== 'boolean')
2494- throw new TypeError("incorrect argument");
2495- return arg;
2496- }
2497- if (!desc.type) {
2498- throw new InternalError("argument description miss required parameter");
2499- }
2500- if ((arg instanceof desc.type) || (desc.type === Function && ((typeof arg) === 'function'))
2501- || (arg === null && desc.allowNull)) {
2502- if (desc.type === Function) {
2503- if (!arg) {
2504- return null;
2505- }
2506-
2507- var id;
2508- if (desc.argAsCallbackId !== undefined) {
2509- id = realArgs[desc.argAsCallbackId];
2510- }
2511- return CallbackManager.makeCallback(uwa.ContextActionCallbackType,
2512- function (context, user_data) {
2513- arg();
2514- }, name, id);
2515- }
2516- return arg;
2517- } else {
2518- throw new TypeError("incorrect argument");
2519- }
2520- throw new InternalError("unreacheable");
2521- }
2522- var args = [unity.context], i;
2523- for (i = 0; i < argsDesc.length; i++) {
2524- if (k >= realArgs.length && k > 0 && !argsDesc[i].dummy) {
2525- throw new Error("not enough arguments");
2526- }
2527- var value = argumentSanitaizer(argsDesc[i], realArgs[k]);
2528- k++;
2529-
2530- if (argsDesc[i].obj) {
2531- args = args.concat(value);
2532- } else {
2533- args.push(value);
2534- }
2535- }
2536-
2537- if (k < realArgs.length) {
2538- throw new Error("too much arguments");
2539- }
2540-
2541- if (callback)
2542- callback.apply(uwa, args);
2543- if (func)
2544- return Function.apply.apply(func, [uwa, args]);
2545-
2546- return null;
2547- };
2548-
2549- };
2550- var api = {
2551- init: function(props) {
2552- checkString(props.name, false);
2553- checkString(props.iconUrl, true);
2554- checkString(props.domain, true);
2555- checkString(props.login, true);
2556- checkString(props.mimeTypes, true);
2557- checkString(props.homepage, true);
2558- if (props.homepage && !/^(http|https|file):\/\//.test(props.homepage)) {
2559- throw new TypeError("incorrect argument");
2560- }
2561- backend("init", [props]);
2562- }
2563- ,
2564- acceptData: createArgumentsSanitaizer(null,
2565- [{ array: { element: { str: true } } }, { type: Function, js: true }],
2566- function (context, mimeTypes, callback) {
2567- backend('acceptData', [mimeTypes, callback]);
2568- })
2569- ,
2570- addAction: createArgumentsSanitaizer(null,
2571- [{ str: true }, { type: Function, argAsCallbackId: 0 }],
2572- function (context, name, callback) {
2573- backend('addAction', [name, callback]);
2574- })
2575- ,
2576- clearAction: createArgumentsSanitaizer(null,
2577- [{ str: true }]
2578- , function (context, name) {
2579- backend('clearAction', [name]);
2580- })
2581- ,
2582- clearActions: createArgumentsSanitaizer(null,
2583- [],
2584- function (context) {
2585- backend('clearActions', []);
2586- })
2587- ,
2588- MediaPlayer: {
2589- init: createArgumentsSanitaizer(null,
2590- [{ str: true }],
2591- function (context, name) {
2592- backend('MediaPlayer.init', [name]);
2593- })
2594- ,
2595- onPlayPause: createArgumentsSanitaizer(null,
2596- [{ type: Function, allowNull: true }, { dummy: true }],
2597- function (context, callback) {
2598- backend('MediaPlayer.onPlayPause', [callback]);
2599- }
2600- )
2601- ,
2602- onPrevious: createArgumentsSanitaizer(null,
2603- [{ type: Function, allowNull: true }, { dummy: true }],
2604- function (context, callback) {
2605- backend('MediaPlayer.onPrevious', [callback]);
2606- })
2607- ,
2608- onNext: createArgumentsSanitaizer(null,
2609- [{ type: Function, allowNull: true }, { dummy: true }],
2610- function (context, callback) {
2611- backend('MediaPlayer.onNext', [callback]);
2612- }
2613- )
2614- ,
2615- setTrack: createArgumentsSanitaizer(null,
2616- [{ obj: { artist: { str: true, place: 0, allowNull: true },
2617- album: { str: true, place: 1, allowNull: true },
2618- title: { str: true, place: 2 },
2619- artLocation: { str: true, place: 3, allowNull: true } } }],
2620- function (context, trackinfos) {
2621- backend('MediaPlayer.setTrack', [trackinfos]);
2622- })
2623- ,
2624- setCanGoNext: createArgumentsSanitaizer(null,
2625- [{ number: true }],
2626- function (context, v) {
2627- backend('MediaPlayer.setCanGoNext', [v]);
2628- }
2629- )
2630- ,
2631- setCanGoPrevious: createArgumentsSanitaizer(null,
2632- [{ number: true }],
2633- function (context, v) {
2634- backend('MediaPlayer.setCanGoPrevious', [v]);
2635- }
2636- )
2637- ,
2638- setCanPlay: createArgumentsSanitaizer(null,
2639- [{ number: true }],
2640- function (context, v) { backend('MediaPlayer.setCanPlay', [v]); }
2641- )
2642- ,
2643- setCanPause: createArgumentsSanitaizer(null,
2644- [{ number: true }],
2645- function (context, v) { backend('MediaPlayer.setCanPause', [v]); }
2646- )
2647- ,
2648- setPlaybackState: createArgumentsSanitaizer(null,
2649- [{ number: true }],
2650- function (context, v) { backend('MediaPlayer.setPlaybackState', [v]); }
2651- )
2652- ,
2653- getPlaybackState: createArgumentsSanitaizer(null
2654- , [{ type: Function }]
2655- , function (context, callback) {
2656- backend('MediaPlayer.getPlaybackState', [callback]);
2657- }
2658- )
2659- ,
2660- PlaybackState: {PLAYING: 0, PAUSED:1}
2661- },
2662-
2663- Notification: {
2664- showNotification: createArgumentsSanitaizer(null,
2665- [{ str: true }, { str: true }, { str: true, allowNull: true }],
2666- function (context, title, name, dummy) {
2667- backend('Notification.showNotification', [title, name, dummy]);
2668- }
2669- )
2670- },
2671-
2672- Launcher: {
2673- setCount: createArgumentsSanitaizer(null,
2674- [{ number: true }],
2675- function (context, count) {
2676- backend('Launcher.setCount', [count]);
2677- }
2678- )
2679- ,
2680- clearCount: createArgumentsSanitaizer(null,
2681- [],
2682- function (context) {
2683- backend('Launcher.clearCount', []);
2684- }),
2685- setProgress: createArgumentsSanitaizer(null,
2686- [{ number: true }],
2687- function (context, progress) {
2688- backend('Launcher.setProgress', [progress]);
2689- }
2690- )
2691- ,
2692- clearProgress: createArgumentsSanitaizer(null,
2693- [],
2694- function (context) {
2695- backend('Launcher.clearProgress', []);
2696- }
2697- )
2698- ,
2699- setUrgent: createArgumentsSanitaizer(null,
2700- [],
2701- function (context) {
2702- backend('Launcher.setUrgent', []);
2703- }
2704- )
2705- ,
2706- addAction: function(arg1, arg2) {
2707- backend('Launcher.addAction', [arg1, arg2]);
2708- }
2709- ,
2710- removeAction: createArgumentsSanitaizer(null,
2711- [{ str: true }],
2712- function (context, name) {
2713- backend('Launcher.removeAction', [name]);
2714- }
2715- )
2716- ,
2717- removeActions: createArgumentsSanitaizer(null,
2718- [],
2719- function (context) {
2720- backend('Launcher.removeActions', []);
2721- }
2722- )
2723- },
2724- MessagingIndicator: {
2725- addAction: createArgumentsSanitaizer(null,
2726- [{ str: true }, { type: Function, argAsCallbackId: 0 }, { dummy: true }],
2727- function (context, name, callback, dummy) {
2728- backend('MessagingIndicator.addAction', [name, callback, dummy]);
2729- }
2730- )
2731- ,
2732- showIndicator: function(name, properties) {
2733- backend('MessagingIndicator.showIndicator', [name, properties]);
2734- }
2735- ,
2736- clearIndicator: createArgumentsSanitaizer(null, [{ str: true }], function(context, name) { backend('MessagingIndicator.clearIndicator', [name]); }),
2737- clearIndicators: createArgumentsSanitaizer(null, [], function (context) { backend('MessagingIndicator.clearIndicators', []); })
2738- }
2739- };
2740- return api;
2741-};
2742-
2743
2744=== added file 'chromium-extension/unity-api-page-proxy.js'
2745--- chromium-extension/unity-api-page-proxy.js 1970-01-01 00:00:00 +0000
2746+++ chromium-extension/unity-api-page-proxy.js 2015-01-19 16:40:00 +0000
2747@@ -0,0 +1,146 @@
2748+/**
2749+ *
2750+ *
2751+ */
2752+setTimeout (
2753+ function () {
2754+ var CallbackManagerBuilder = function () {
2755+ var prepend = 'unity-webapps-chromium-api';
2756+ var callbacks = {};
2757+ return {
2758+ store: function (callback) {
2759+ var gensym = function() { return prepend + Math.random(); };
2760+ var id = gensym();
2761+ while (undefined != callbacks[id]) {
2762+ id = gensym();
2763+ }
2764+ callbacks[id] = callback;
2765+ return id;
2766+ }
2767+ ,
2768+ get: function (id) {
2769+ return callbacks[id];
2770+ }
2771+ };
2772+ };
2773+ var callbackmanager = CallbackManagerBuilder();
2774+
2775+ /**
2776+ * Acknowledge that the API has been fully injected
2777+ */
2778+ var sendApiCreatedAcknowledge = function () {
2779+ var e = document.createEvent ("Events");
2780+ e.initEvent ("unity-webapps-api-ready", false, false);
2781+ document.dispatchEvent (e);
2782+ };
2783+
2784+ /**
2785+ *
2786+ *
2787+ */
2788+ function sendToApi (type, data) {
2789+ var callback = null;
2790+ var d = document.createElement ("textarea");
2791+ var e = document.createEvent ("Events");
2792+ d.style.cssText = "display:none;";
2793+
2794+ var isIterableObject = function(obj) {
2795+ if (obj === undefined || obj === null) {
2796+ return false;
2797+ }
2798+ var t = typeof(obj);
2799+ var types = {'string': 0, 'function': 0, 'boolean': 0, 'number': 0, 'undefined': 0};
2800+ return types[t] === undefined;
2801+ };
2802+
2803+ function transformToIdIfNecessary(obj) {
2804+ var ret = obj;
2805+ if (obj instanceof Function) {
2806+ var id = callbackmanager.store(obj);
2807+ ret = {callbackid: id};
2808+ }
2809+ return ret;
2810+ }
2811+ // map function callback (not serializable to a different world)
2812+ // to ids
2813+ function transformCallbacksToIds (obj) {
2814+ if ( ! isIterableObject(obj)) {
2815+ return transformToIdIfNecessary (obj);
2816+ }
2817+ var ret = (obj instanceof Array) ? [] : {};
2818+ for (var key in obj) {
2819+ if (obj.hasOwnProperty(key)) {
2820+ if (obj[key] instanceof Function) {
2821+ var id = callbackmanager.store(obj[key]);
2822+ ret[key] = {callbackid: id};
2823+ }
2824+ else if (isIterableObject (obj[key])) {
2825+ ret[key] = transformCallbacksToIds (obj[key]);
2826+ }
2827+ else {
2828+ ret[key] = obj[key];
2829+ }
2830+ }
2831+ }
2832+ return ret;
2833+ };
2834+
2835+ // TODO: assumes some structure, does not play well w/ arrays
2836+ // actually converts: [1,2,3] -> {'0': 1, '1': 2, '2': 3}
2837+ d.value = JSON.stringify (
2838+ data.map (
2839+ function (datum) {
2840+ return transformCallbacksToIds (datum);
2841+ }
2842+ )
2843+ );
2844+ d.addEventListener ("unity-webapps-chromium-api-com-link-ack"
2845+ ,
2846+ function() {
2847+ if (callback) callback (d.value);
2848+ d.parentNode.removeChild (d);
2849+ }
2850+ , true);
2851+
2852+ d.setAttribute ("data-eventType", type);
2853+ document.body.appendChild (d);
2854+ e.initEvent ("unity-webapps-chromium-api-com-link", false, true);
2855+ d.dispatchEvent (e);
2856+ };
2857+
2858+ document.addEventListener ("unity-webapps-chromium-api-com-link-callback-called"
2859+ ,
2860+ function(event) {
2861+ var from = event.target;
2862+ if (from) {
2863+ if (from.value) {
2864+ var callback = callbackmanager.get(from.value);
2865+ if (callback) {
2866+ callback ();
2867+ }
2868+ }
2869+ var ret = document.createEvent('Events');
2870+ ret.initEvent('unity-webapps-chromium-api-com-link-callback-called-ack', true, false);
2871+ from.dispatchEvent(ret);
2872+ }
2873+ }
2874+ , true);
2875+
2876+ var api = UnityWebappsApiPageProxyBuilder(sendToApi);
2877+
2878+ function unity() {
2879+ }
2880+ unity.prototype = {
2881+ __proto__: window.external,
2882+ getUnityObject: function (version) {
2883+ console.log ('Proxy: getUnityObject called with version ' + version);
2884+ if (version === 1)
2885+ return api;
2886+ throw new Error("incorrect version");
2887+ }
2888+ };
2889+ window.external = new unity();
2890+
2891+ sendApiCreatedAcknowledge();
2892+ }
2893+, 0);
2894
2895=== removed file 'chromium-extension/unity-api-page-proxy.js'
2896--- chromium-extension/unity-api-page-proxy.js 2013-12-16 07:15:32 +0000
2897+++ chromium-extension/unity-api-page-proxy.js 1970-01-01 00:00:00 +0000
2898@@ -1,146 +0,0 @@
2899-/**
2900- *
2901- *
2902- */
2903-setTimeout (
2904- function () {
2905- var CallbackManagerBuilder = function () {
2906- var prepend = 'unity-webapps-chromium-api';
2907- var callbacks = {};
2908- return {
2909- store: function (callback) {
2910- var gensym = function() { return prepend + Math.random(); };
2911- var id = gensym();
2912- while (undefined != callbacks[id]) {
2913- id = gensym();
2914- }
2915- callbacks[id] = callback;
2916- return id;
2917- }
2918- ,
2919- get: function (id) {
2920- return callbacks[id];
2921- }
2922- };
2923- };
2924- var callbackmanager = CallbackManagerBuilder();
2925-
2926- /**
2927- * Acknowledge that the API has been fully injected
2928- */
2929- var sendApiCreatedAcknowledge = function () {
2930- var e = document.createEvent ("Events");
2931- e.initEvent ("unity-webapps-api-ready", false, false);
2932- document.dispatchEvent (e);
2933- };
2934-
2935- /**
2936- *
2937- *
2938- */
2939- function sendToApi (type, data) {
2940- var callback = null;
2941- var d = document.createElement ("textarea");
2942- var e = document.createEvent ("Events");
2943- d.style.cssText = "display:none;";
2944-
2945- var isIterableObject = function(obj) {
2946- if (obj === undefined || obj === null) {
2947- return false;
2948- }
2949- var t = typeof(obj);
2950- var types = {'string': 0, 'function': 0, 'boolean': 0, 'number': 0, 'undefined': 0};
2951- return types[t] === undefined;
2952- };
2953-
2954- function transformToIdIfNecessary(obj) {
2955- var ret = obj;
2956- if (obj instanceof Function) {
2957- var id = callbackmanager.store(obj);
2958- ret = {callbackid: id};
2959- }
2960- return ret;
2961- }
2962- // map function callback (not serializable to a different world)
2963- // to ids
2964- function transformCallbacksToIds (obj) {
2965- if ( ! isIterableObject(obj)) {
2966- return transformToIdIfNecessary (obj);
2967- }
2968- var ret = (obj instanceof Array) ? [] : {};
2969- for (var key in obj) {
2970- if (obj.hasOwnProperty(key)) {
2971- if (obj[key] instanceof Function) {
2972- var id = callbackmanager.store(obj[key]);
2973- ret[key] = {callbackid: id};
2974- }
2975- else if (isIterableObject (obj[key])) {
2976- ret[key] = transformCallbacksToIds (obj[key]);
2977- }
2978- else {
2979- ret[key] = obj[key];
2980- }
2981- }
2982- }
2983- return ret;
2984- };
2985-
2986- // TODO: assumes some structure, does not play well w/ arrays
2987- // actually converts: [1,2,3] -> {'0': 1, '1': 2, '2': 3}
2988- d.value = JSON.stringify (
2989- data.map (
2990- function (datum) {
2991- return transformCallbacksToIds (datum);
2992- }
2993- )
2994- );
2995- d.addEventListener ("unity-webapps-chromium-api-com-link-ack"
2996- ,
2997- function() {
2998- if (callback) callback (d.value);
2999- d.parentNode.removeChild (d);
3000- }
3001- , true);
3002-
3003- d.setAttribute ("data-eventType", type);
3004- document.body.appendChild (d);
3005- e.initEvent ("unity-webapps-chromium-api-com-link", false, true);
3006- d.dispatchEvent (e);
3007- };
3008-
3009- document.addEventListener ("unity-webapps-chromium-api-com-link-callback-called"
3010- ,
3011- function(event) {
3012- var from = event.target;
3013- if (from) {
3014- if (from.value) {
3015- var callback = callbackmanager.get(from.value);
3016- if (callback) {
3017- callback ();
3018- }
3019- }
3020- var ret = document.createEvent('Events');
3021- ret.initEvent('unity-webapps-chromium-api-com-link-callback-called-ack', true, false);
3022- from.dispatchEvent(ret);
3023- }
3024- }
3025- , true);
3026-
3027- var api = UnityWebappsApiPageProxyBuilder(sendToApi);
3028-
3029- function unity() {
3030- }
3031- unity.prototype = {
3032- __proto__: window.external,
3033- getUnityObject: function (version) {
3034- console.log ('Proxy: getUnityObject called with version ' + version);
3035- if (version === 1)
3036- return api;
3037- throw new Error("incorrect version");
3038- }
3039- };
3040- window.external = new unity();
3041-
3042- sendApiCreatedAcknowledge();
3043- }
3044-, 0);
3045
3046=== modified file 'chromium-extension/unity-webapps.json.in'
3047--- chromium-extension/unity-webapps.json.in 2012-04-30 15:39:21 +0000
3048+++ chromium-extension/unity-webapps.json.in 2015-01-19 16:40:00 +0000
3049@@ -1,4 +1,4 @@
3050 {
3051- "external_crx": "@EXTDIR@",
3052- "external_version": "@VERSION@"
3053+ '"external_crx": "$${EXTENSION_DIR}/$${EXTENSION_FILE}"',
3054+ '"external_version": "$${PROJECT_VERSION}"'
3055 }
3056
3057=== removed file 'chromium-extension/unity_api_page_proxy_generator.py'
3058--- chromium-extension/unity_api_page_proxy_generator.py 2012-06-17 14:33:16 +0000
3059+++ chromium-extension/unity_api_page_proxy_generator.py 1970-01-01 00:00:00 +0000
3060@@ -1,96 +0,0 @@
3061-#!/usr/bin/python
3062-
3063-"""
3064-Generates a *.js file (defaults to unity-api-page-proxy-builder.js) by parsing & extracting expected
3065-information out of an input .js filename (defaults to unity-api.js). Extracts only the meaningful bits
3066-(mostly the argument sanitizer bits) and generates a proper web page side unity api w/ a proper validation
3067-layer (as exposed by unity-api.js)
3068-
3069-Takes an input filename as an argument.
3070-"""
3071-
3072-import sys
3073-
3074-class DEFAULTS:
3075- input_api_filename = "unity-api.js"
3076- output_api_filename = "unity-api-page-proxy-builder-gen-py.js"
3077-
3078-input_api_filename = DEFAULTS.input_api_filename
3079-output_api_filename = DEFAULTS.output_api_filename
3080-
3081-def extractFunctionDefinition (name, content):
3082- import re
3083- funcre = re.compile (r'([^\w_]|\s*)(' + name + r')\s*\((?P<params>.*?)\)\s*{', re.MULTILINE)
3084- m = re.search (funcre, content)
3085- if m:
3086- s = ['{']
3087- start = m.end(0)
3088- end = start + 1
3089- for idx in xrange (start, len(content)-1):
3090- if content[idx] == '{':
3091- s.append('{')
3092- elif content[idx] == '}':
3093- s.pop()
3094- if s.count('{') == 0:
3095- end = idx
3096- break
3097- return m.group('params'), content[start:end]
3098- return None, None
3099-
3100-def untabify (body):
3101- mintabs = min([len([c for c in line if c == ' ' or c == '\t']) for line in body.split('\n') if len(line.strip()) != 0])
3102- return '\n'.join ([line[mintabs:] for line in body.split('\n')])
3103-
3104-def generateFunction (name, params, body):
3105- return """
3106-var %s = function (%s) {
3107- %s
3108-};
3109-""" % (name, params, untabify(body))
3110-
3111-def extractObjectDefinition(content, oname):
3112- import re
3113- apire = re.compile(oname + '\s*[=|:]\s*', re.MULTILINE)
3114- m = re.search(apire, content)
3115- s = []
3116- start = m.end(0)
3117- end = start
3118- for idx in xrange (start, len(content)-1):
3119- if content[idx] == '{':
3120- s.append('{')
3121- elif content[idx] == '}':
3122- s.pop()
3123- if s.count('{') == 0:
3124- end = idx
3125- break
3126- return content[start:end]
3127-
3128-def extractApiDefinition(content):
3129- return extractObjectDefinition(content, 'api')
3130-
3131-def generateUnityApiTargetFile (inputfilename, outputfilename):
3132- content = open(inputfilename).read()
3133- function_names = ['findName', 'stringify', 'stringifyArgs', 'createArgumentsSanitaizer']
3134- extracted_data = [(function_name, extractFunctionDefinition(function_name, content)) for function_name in function_names]
3135- extracted_functions = [{'name': extracted_datum[0], 'params': extracted_datum[1][0], 'body': extracted_datum[1][1]} for extracted_datum in extracted_data]
3136-
3137- buildercontent = 'var UnityWebappsApiPageProxyBuilder = function(backend) {\n'
3138- buildercontent += """
3139- var dummy = true;
3140- var unity = { context: dummy, contextReady: dummy };
3141- var uwa = { ContextActionCallbackType: null };
3142-
3143- var CallbackManager = {
3144- makeCallback: function (dumd, func) {
3145- return func;
3146- }
3147- };
3148-"""
3149- buildercontent += '\n'.join([generateFunction(func['name'], func['params'], func['body']) for func in extracted_functions])
3150- buildercontent += 'var api = {\n};\n'
3151- buildercontent += '};\n\n'
3152- open(outputfilename, "w+").write(buildercontent)
3153-
3154-generateUnityApiTargetFile (input_api_filename, output_api_filename)
3155-
3156-
3157
3158=== added file 'common-project-config.pri'
3159--- common-project-config.pri 1970-01-01 00:00:00 +0000
3160+++ common-project-config.pri 2015-01-19 16:40:00 +0000
3161@@ -0,0 +1,41 @@
3162+#-----------------------------------------------------------------------------
3163+# Common configuration for all projects.
3164+#-----------------------------------------------------------------------------
3165+
3166+# we don't like warnings...
3167+QMAKE_CXXFLAGS += -Werror
3168+# Disable RTTI
3169+QMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
3170+
3171+TOP_SRC_DIR = $$PWD
3172+TOP_BUILD_DIR = $${TOP_SRC_DIR}/$(BUILD_DIR)
3173+
3174+include(coverage.pri)
3175+
3176+#-----------------------------------------------------------------------------
3177+# setup the installation prefix
3178+#-----------------------------------------------------------------------------
3179+INSTALL_PREFIX = /usr # default installation prefix
3180+
3181+# default prefix can be overriden by defining PREFIX when running qmake
3182+isEmpty(PREFIX) {
3183+ message("====")
3184+ message("==== NOTE: To override the installation path run: `qmake PREFIX=/custom/path'")
3185+ message("==== (current installation path is `$${INSTALL_PREFIX}')")
3186+} else {
3187+ INSTALL_PREFIX = $${PREFIX}
3188+ message("====")
3189+ message("==== install prefix set to `$${INSTALL_PREFIX}'")
3190+}
3191+
3192+INSTALL_LIBDIR = $${INSTALL_PREFIX}/lib
3193+
3194+isEmpty(LIBDIR) {
3195+ message("====")
3196+ message("==== NOTE: To override the library installation path run: `qmake LIBDIR=/custom/path'")
3197+ message("==== (current installation path is `$${INSTALL_LIBDIR}')")
3198+} else {
3199+ INSTALL_LIBDIR = $${LIBDIR}
3200+ message("====")
3201+ message("==== install prefix set to `$${INSTALL_LIBDIR}'")
3202+}
3203
3204=== added file 'common-vars.pri'
3205--- common-vars.pri 1970-01-01 00:00:00 +0000
3206+++ common-vars.pri 2015-01-19 16:40:00 +0000
3207@@ -0,0 +1,6 @@
3208+#-----------------------------------------------------------------------------
3209+# Common variables for all projects.
3210+#-----------------------------------------------------------------------------
3211+
3212+PROJECT_NAME = unity_webapps_chromium
3213+PROJECT_VERSION = 3.2
3214
3215=== removed file 'configure.ac'
3216--- configure.ac 2014-03-07 15:22:55 +0000
3217+++ configure.ac 1970-01-01 00:00:00 +0000
3218@@ -1,62 +0,0 @@
3219-dnl Process this file with autoconf to produce a configure script.
3220-dnl Created by Anjuta application wizard.
3221-
3222-AC_INIT(unity_webapps_chromium, 3.1)
3223-AC_CONFIG_HEADERS([config.h])
3224-AM_INIT_AUTOMAKE([1.11])
3225-AM_SILENT_RULES([yes])
3226-AC_PROG_CC
3227-AC_PROG_CC_C99
3228-AM_PROG_CC_C_O
3229-
3230-AC_CONFIG_MACRO_DIR([m4])
3231-
3232-AC_DISABLE_STATIC
3233-LT_INIT
3234-
3235-PKG_CHECK_MODULES(UNITY_NPAPI_PLUGIN, [libunity_webapps-0.2 glib-2.0 libnotify libunity-webapps-repository libwnck-1.0])
3236-
3237-
3238-dnl ***************************************************************************
3239-dnl debug
3240-dnl ***************************************************************************
3241-
3242-AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug],[enable debugging. [default=no]]), [enable_debug="yes"],[enable_debug="no"])
3243-
3244-if test "x$enable_debug" = "xyes"; then
3245- NPAPI_DEBUG_CFLAGS="-DNPAPI_DEBUG_ENABLED"
3246-else
3247- NPAPI_DEBUG_CFLAGS=""
3248-fi
3249-
3250-AC_SUBST(NPAPI_DEBUG_CFLAGS)
3251-
3252-dnl ========== Tests ==========
3253-
3254-AC_ARG_ENABLE(tests, AC_HELP_STRING([--enable-tests],
3255- [Enable tests. [default=no]]),
3256- [enable_tests="yes"], [enable_tests="no"])
3257-if test "x$enable_tests" = "xyes"; then
3258- AC_DEFINE([ENABLE_TESTS], 1, [Enable tests.])
3259- # Tests need debug to be enabled
3260- enable_debug="yes"
3261-fi
3262-AM_CONDITIONAL([ENABLE_TESTS], [test "x$enable_tests" = "xyes"])
3263-
3264-dnl ===== gcov coverage reporting =====
3265-m4_include([m4/gcov.m4])
3266-AC_TDD_GCOV
3267-AC_SUBST(UNITY_NPAPI_PLUGIN_COVERAGE_CFLAGS)
3268-AC_SUBST(UNITY_NPAPI_PLUGIN_COVERAGE_CXXFLAGS)
3269-AC_SUBST(UNITY_NPAPI_PLUGIN_COVERAGE_LDFLAGS)
3270-
3271-AC_OUTPUT([
3272-Makefile
3273-chromium-extension/Makefile
3274-npapi-plugin/src/libunity_npapi_plugin-0.1.pc
3275-npapi-plugin/Makefile
3276-npapi-plugin/src/Makefile
3277-tests/Makefile
3278-tests/unit/Makefile
3279-tests/unit/npapi/Makefile
3280-po/Makefile])
3281
3282=== added file 'coverage.pri'
3283--- coverage.pri 1970-01-01 00:00:00 +0000
3284+++ coverage.pri 2015-01-19 16:40:00 +0000
3285@@ -0,0 +1,49 @@
3286+# Coverage
3287+CONFIG(coverage) {
3288+ OBJECTS_DIR =
3289+ MOC_DIR =
3290+ TOP_SRC_DIR = $$PWD
3291+
3292+ LIBS += -lgcov
3293+ QMAKE_CXXFLAGS += --coverage
3294+ QMAKE_LDFLAGS += --coverage
3295+
3296+ QMAKE_EXTRA_TARGETS += coverage cov
3297+ QMAKE_EXTRA_TARGETS += clean-gcno clean-gcda coverage-html \
3298+ generate-coverage-html clean-coverage-html coverage-gcovr \
3299+ generate-gcovr generate-coverage-gcovr clean-coverage-gcovr
3300+
3301+ clean-gcno.commands = \
3302+ "@echo Removing old coverage instrumentation"; \
3303+ "find -name '*.gcno' -print | xargs -r rm"
3304+
3305+ clean-gcda.commands = \
3306+ "@echo Removing old coverage results"; \
3307+ "find -name '*.gcda' -print | xargs -r rm"
3308+
3309+ coverage-html.depends = clean-gcda check generate-coverage-html
3310+
3311+ generate-coverage-html.commands = \
3312+ "@echo Collecting coverage data"; \
3313+ "lcov --directory $${TOP_SRC_DIR} --capture --output-file coverage.info --no-checksum --compat-libtool"; \
3314+ "lcov --extract coverage.info \"*/messaging-host/*.cpp\" -o coverage.info"; \
3315+ "lcov --remove coverage.info \"moc_*.cpp\" --remove coverage.info \"tests/*.cpp\" -o coverage.info"; \
3316+ "LANG=C genhtml --prefix $${TOP_SRC_DIR} --output-directory coverage-html --title \"Code Coverage\" --legend --show-details coverage.info"
3317+
3318+ clean-coverage-html.depends = clean-gcda
3319+ clean-coverage-html.commands = \
3320+ "lcov --directory $${TOP_SRC_DIR} -z"; \
3321+ "rm -rf coverage.info coverage-html"
3322+
3323+ coverage-gcovr.depends = clean-gcda check generate-coverage-gcovr
3324+
3325+ generate-coverage-gcovr.commands = \
3326+ "@echo Generating coverage GCOVR report"; \
3327+ "gcovr -x -r $${TOP_SRC_DIR} -o $${TOP_SRC_DIR}/coverage.xml -e \".*/moc_.*\" -e \"tests/.*\" -e \".*\\.h\""
3328+
3329+ clean-coverage-gcovr.depends = clean-gcda
3330+ clean-coverage-gcovr.commands = \
3331+ "rm -rf $${TOP_SRC_DIR}/coverage.xml"
3332+
3333+ QMAKE_CLEAN += *.gcda *.gcno coverage.info coverage.xml
3334+}
3335
3336=== modified file 'debian/changelog'
3337--- debian/changelog 2014-03-18 20:59:35 +0000
3338+++ debian/changelog 2015-01-19 16:40:00 +0000
3339@@ -1,3 +1,13 @@
3340+unity-chromium-extension (3.2.0+14.10.20140626-0ubuntu1) UNRELEASED; urgency=medium
3341+
3342+ [ Justin McPherson ]
3343+ * Support native messaging. (with Alberto Mardegan)
3344+
3345+ [ Ubuntu daily release ]
3346+ * New rebuild forced
3347+
3348+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 26 Jun 2014 09:40:22 +0000
3349+
3350 unity-chromium-extension (3.0.0+14.04.20140318-0ubuntu1) trusty; urgency=low
3351
3352 [ Ubuntu daily release ]
3353
3354=== modified file 'debian/compat'
3355--- debian/compat 2012-11-19 22:39:34 +0000
3356+++ debian/compat 2015-01-19 16:40:00 +0000
3357@@ -1,1 +1,1 @@
3358-8
3359+9
3360
3361=== modified file 'debian/control'
3362--- debian/control 2014-03-18 20:50:57 +0000
3363+++ debian/control 2015-01-19 16:40:00 +0000
3364@@ -1,22 +1,18 @@
3365 Source: unity-chromium-extension
3366 Priority: optional
3367 Maintainer: Ubuntu Desktop Team <ubuntu-desktop@lists.ubuntu.com>
3368-# FIXME: We should be using debhelper 9, but that breaks the build
3369-# for some currently unknown reason.
3370-Build-Depends: autotools-dev,
3371- chromium-browser (>= 20.0.1132.47~r144678-0ubuntu4),
3372- debhelper (>= 8),
3373+Build-Depends: chromium-browser (>= 34.0.1847.116-0ubuntu2),
3374+ debhelper (>= 9),
3375 dh-autoreconf,
3376- gnome-common,
3377 libglib2.0-dev,
3378- libgtest-dev,
3379- libnotify-dev,
3380 libunity-webapps-dev (>= 1.8.0),
3381- libwnck-dev,
3382 openssl,
3383 pkg-config,
3384 vim-common,
3385 zip,
3386+ qt5-default,
3387+ qt5-qmake,
3388+ xvfb,
3389 Standards-Version: 3.9.5
3390 Section: gnome
3391 Homepage: https://launchpad.net/unity-chromium-extension
3392@@ -27,7 +23,7 @@
3393
3394 Package: unity-chromium-extension
3395 Architecture: any
3396-Depends: chromium-browser (>= 20.0.1132.47~r144678-0ubuntu4),
3397+Depends: chromium-browser (>= 34.0.1847.116-0ubuntu2),
3398 unity-webapps-service,
3399 webbrowser-app,
3400 ${misc:Depends},
3401
3402=== modified file 'debian/copyright'
3403--- debian/copyright 2012-11-19 19:26:58 +0000
3404+++ debian/copyright 2015-01-19 16:40:00 +0000
3405@@ -8,48 +8,3 @@
3406 On Debian systems, the complete text of the GNU General
3407 Public License version 3 can be found in `/usr/share/common-licenses/GPL-3'.
3408
3409-Files: npapi-plugin/*
3410-Copyright: 2012 Canonical Ltd
3411-License: GPL-2+
3412-
3413-Files: npapi-plugin/src/npapi-headers/headers/nptypes.h
3414-Copyright: 2004 mozilla.org
3415-License: GPL-2+
3416-
3417-Files: npapi-plugin/src/npapi-headers/headers/npapi.h
3418- npapi-plugin/src/npapi-headers/headers/npfunctions.h
3419-Copyright: 1998 Netscape Communications Corporation
3420-License: GPL-2+
3421-
3422-Files: npapi-plugin/src/npapi-headers/headers/npruntime.h
3423-Copyright: 2004 Apple Computer, Inc.
3424-License:
3425- Redistribution and use in source and binary forms, with or without
3426- modification, are permitted provided that the following conditions are
3427- met:
3428- .
3429- 1. Redistributions of source code must retain the above copyright
3430- notice, this list of conditions and the following disclaimer.
3431- 2. Redistributions in binary form must reproduce the above copyright
3432- notice, this list of conditions and the following disclaimer in the
3433- documentation and/or other materials provided with the distribution.
3434- 3. Neither the names of Apple Computer, Inc. ("Apple") or The Mozilla
3435- Foundation ("Mozilla") nor the names of their contributors may be used
3436- to endorse or promote products derived from this software without
3437- specific prior written permission.
3438- .
3439- THIS SOFTWARE IS PROVIDED BY APPLE, MOZILLA AND THEIR CONTRIBUTORS "AS
3440- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
3441- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
3442- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE, MOZILLA OR
3443- THEIR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3444- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
3445- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3446- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3447- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3448- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3449- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3450-
3451-License: GPL-2+
3452- On Debian systems, the complete text of the GNU General
3453- Public License version 2 can be found in `/usr/share/common-licenses/GPL-2'.
3454
3455=== modified file 'debian/rules'
3456--- debian/rules 2013-09-20 19:12:01 +0000
3457+++ debian/rules 2015-01-19 16:40:00 +0000
3458@@ -4,17 +4,15 @@
3459 #export DH_VERBOSE=1
3460 export DPKG_GENSYMBOLS_CHECK_LEVEL=4
3461
3462-override_dh_autoreconf:
3463- NOCONFIGURE=1 dh_autoreconf ./autogen.sh
3464-
3465 override_dh_auto_configure:
3466- cp debian/unity-webapps.pem .
3467- dh_auto_configure -- --enable-tests=yes
3468+ cp debian/unity-webapps.pem chromium-extension/
3469+ dh_auto_configure
3470+
3471+override_dh_auto_install:
3472+ dh_auto_install --destdir=debian/tmp
3473
3474 override_dh_install:
3475- rm -rf debian/*/usr/lib/*npapi* debian/*/usr/lib/pkgconfig \
3476- debian/*/usr/include
3477 dh_install --fail-missing
3478
3479 %:
3480- dh $@ --with autoreconf --fail-missing
3481+ dh $@
3482
3483=== added file 'debian/unity-chromium-extension.install'
3484--- debian/unity-chromium-extension.install 1970-01-01 00:00:00 +0000
3485+++ debian/unity-chromium-extension.install 2015-01-19 16:40:00 +0000
3486@@ -0,0 +1,4 @@
3487+etc/chromium/native-messaging-hosts/com.canonical.webapp.installer.json
3488+usr/lib/libunity-chromium/unity-webapps.crx
3489+usr/share/chromium/extensions/*.json
3490+usr/share/unity-webapps/bin/unity-webapps-messaging-host
3491
3492=== removed directory 'm4'
3493=== removed file 'm4/gcov.m4'
3494--- m4/gcov.m4 2013-12-23 01:17:40 +0000
3495+++ m4/gcov.m4 1970-01-01 00:00:00 +0000
3496@@ -1,79 +0,0 @@
3497-# Checks for existence of coverage tools:
3498-# * gcov
3499-# * lcov
3500-# * genhtml
3501-# * gcovr
3502-#
3503-# Sets ac_cv_check_gcov to yes if tooling is present
3504-# and reports the executables to the variables LCOV, GCOVR and GENHTML.
3505-AC_DEFUN([AC_TDD_GCOV],
3506-[
3507- AC_ARG_ENABLE(gcov,
3508- AS_HELP_STRING([--enable-gcov],
3509- [enable coverage testing with gcov]),
3510- [use_gcov=yes], [use_gcov=no])
3511-
3512- AM_CONDITIONAL(HAVE_GCOV, test "x$use_gcov" = "xyes")
3513-
3514- if test "x$use_gcov" = "xyes"; then
3515- # we need gcc:
3516- if test "$GCC" != "yes"; then
3517- AC_MSG_ERROR([GCC is required for --enable-gcov])
3518- fi
3519-
3520- # Check if ccache is being used
3521- AC_CHECK_PROG(SHTOOL, shtool, shtool)
3522- if test "$SHTOOL"; then
3523- AS_CASE([`$SHTOOL path $CC`],
3524- [*ccache*], [gcc_ccache=yes],
3525- [gcc_ccache=no])
3526- fi
3527-
3528- if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then
3529- AC_MSG_ERROR([ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1.])
3530- fi
3531-
3532- lcov_version_list="1.6 1.7 1.8 1.9 1.10"
3533- AC_CHECK_PROG(LCOV, lcov, lcov)
3534- AC_CHECK_PROG(GENHTML, genhtml, genhtml)
3535-
3536- if test "$LCOV"; then
3537- AC_CACHE_CHECK([for lcov version], glib_cv_lcov_version, [
3538- glib_cv_lcov_version=invalid
3539- lcov_version=`$LCOV -v 2>/dev/null | $SED -e 's/^.* //'`
3540- for lcov_check_version in $lcov_version_list; do
3541- if test "$lcov_version" = "$lcov_check_version"; then
3542- glib_cv_lcov_version="$lcov_check_version (ok)"
3543- fi
3544- done
3545- ])
3546- else
3547- lcov_msg="To enable code coverage reporting you must have one of the following lcov versions installed: $lcov_version_list"
3548- AC_MSG_ERROR([$lcov_msg])
3549- fi
3550-
3551- case $glib_cv_lcov_version in
3552- ""|invalid[)]
3553- lcov_msg="You must have one of the following versions of lcov: $lcov_version_list (found: $lcov_version)."
3554- AC_MSG_ERROR([$lcov_msg])
3555- LCOV="exit 0;"
3556- ;;
3557- esac
3558-
3559- if test -z "$GENHTML"; then
3560- AC_MSG_ERROR([Could not find genhtml from the lcov package])
3561- fi
3562-
3563- # Remove all optimization flags from CFLAGS
3564- changequote({,})
3565- CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'`
3566- changequote([,])
3567-
3568- # Add the special gcc flags
3569- UNITY_NPAPI_PLUGIN_COVERAGE_CFLAGS="--coverage"
3570- UNITY_NPAPI_PLUGIN_COVERAGE_CXXFLAGS="--coverage"
3571- UNITY_NPAPI_PLUGIN_COVERAGE_LDFLAGS="-lgcov"
3572-
3573-fi
3574-]) # AC_TDD_GCOV
3575-
3576
3577=== added directory 'messaging-host'
3578=== added file 'messaging-host/Makefile.am'
3579--- messaging-host/Makefile.am 1970-01-01 00:00:00 +0000
3580+++ messaging-host/Makefile.am 2015-01-19 16:40:00 +0000
3581@@ -0,0 +1,2 @@
3582+EXTRA_DIST += \
3583+ installation-host
3584
3585=== added file 'messaging-host/com.canonical.webapp.installer.json.in'
3586--- messaging-host/com.canonical.webapp.installer.json.in 1970-01-01 00:00:00 +0000
3587+++ messaging-host/com.canonical.webapp.installer.json.in 2015-01-19 16:40:00 +0000
3588@@ -0,0 +1,9 @@
3589+{
3590+ '"name": "com.canonical.webapp.installer"',
3591+ '"description": "Canonical WebApp Installation Host"',
3592+ '"path": "$${target.path}/$${TARGET}"',
3593+ '"type": "stdio"',
3594+ '"allowed_origins"': [
3595+ '"chrome-extension://pmoflmbbcfgacopiikdcpmbiellfihdg/"'
3596+ ]
3597+}
3598
3599=== added file 'messaging-host/connection.cpp'
3600--- messaging-host/connection.cpp 1970-01-01 00:00:00 +0000
3601+++ messaging-host/connection.cpp 2015-01-19 16:40:00 +0000
3602@@ -0,0 +1,152 @@
3603+/*
3604+ * Copyright (C) 2014 Canonical Ltd.
3605+ *
3606+ * This file is part of unity-chromium-extension
3607+ *
3608+ * This program is free software: you can redistribute it and/or modify it
3609+ * under the terms of the GNU General Public License version 3, as published
3610+ * by the Free Software Foundation.
3611+ *
3612+ * This program is distributed in the hope that it will be useful, but
3613+ * WITHOUT ANY WARRANTY; without even the implied warranties of
3614+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3615+ * PURPOSE. See the GNU General Public License for more details.
3616+ *
3617+ * You should have received a copy of the GNU General Public License along
3618+ * with this program. If not, see <http://www.gnu.org/licenses/>.
3619+ */
3620+
3621+#include "connection.h"
3622+
3623+#include <QByteArray>
3624+#include <QDebug>
3625+#include <QFile>
3626+#include <QJsonDocument>
3627+#include <QSocketNotifier>
3628+#include <fcntl.h>
3629+#include <stdio.h>
3630+#include <unistd.h>
3631+
3632+using namespace UnityWebapps;
3633+
3634+namespace UnityWebapps {
3635+
3636+class ConnectionPrivate: public QObject
3637+{
3638+ Q_OBJECT
3639+ Q_DECLARE_PUBLIC(Connection)
3640+
3641+public:
3642+ inline ConnectionPrivate(Connection *connection);
3643+ inline ~ConnectionPrivate();
3644+
3645+ bool open();
3646+
3647+private Q_SLOTS:
3648+ void onReadyRead();
3649+
3650+private:
3651+ QFile m_readChannel;
3652+ QFile m_writeChannel;
3653+ QByteArray m_readBuffer;
3654+ int m_expectedLength;
3655+ mutable Connection *q_ptr;
3656+};
3657+
3658+} // namespace
3659+
3660+ConnectionPrivate::ConnectionPrivate(Connection *connection):
3661+ QObject(connection),
3662+ m_expectedLength(0),
3663+ q_ptr(connection)
3664+{
3665+}
3666+
3667+ConnectionPrivate::~ConnectionPrivate()
3668+{
3669+}
3670+
3671+bool ConnectionPrivate::open()
3672+{
3673+ bool ok;
3674+
3675+ int flag = fcntl(STDIN_FILENO, F_GETFL);
3676+ if (Q_UNLIKELY(flag == -1)) return false;
3677+
3678+ fcntl(STDIN_FILENO, F_SETFL, flag | O_NONBLOCK);
3679+
3680+ ok = m_readChannel.open(stdin, QIODevice::ReadOnly);
3681+ if (Q_UNLIKELY(!ok)) return false;
3682+
3683+ ok = m_writeChannel.open(stdout, QIODevice::WriteOnly);
3684+ if (Q_UNLIKELY(!ok)) return false;
3685+
3686+ QSocketNotifier *notifier = new QSocketNotifier(m_readChannel.handle(),
3687+ QSocketNotifier::Read,
3688+ this);
3689+ QObject::connect(notifier, SIGNAL(activated(int)),
3690+ this, SLOT(onReadyRead()));
3691+
3692+ // There might be already something to read
3693+ onReadyRead();
3694+
3695+ return true;
3696+}
3697+
3698+void ConnectionPrivate::onReadyRead()
3699+{
3700+ Q_Q(Connection);
3701+
3702+ while (true) {
3703+ if (m_expectedLength == 0) {
3704+ /* We are beginning a new read */
3705+
3706+ quint32 length;
3707+ int bytesRead = m_readChannel.read((char *)&length,
3708+ sizeof(length));
3709+ if (bytesRead < int(sizeof(length))) break;
3710+ m_expectedLength = length;
3711+ m_readBuffer.clear();
3712+ }
3713+
3714+ int neededBytes = m_expectedLength - m_readBuffer.length();
3715+ QByteArray buffer = m_readChannel.read(neededBytes);
3716+ m_readBuffer += buffer;
3717+ if (buffer.length() < neededBytes) break;
3718+ if (m_readBuffer.length() == m_expectedLength) {
3719+ QJsonDocument doc = QJsonDocument::fromJson(m_readBuffer);
3720+ Q_EMIT q->messageReceived(doc.toVariant().toMap());
3721+ m_expectedLength = 0;
3722+ }
3723+ }
3724+}
3725+
3726+Connection::Connection(QObject *parent):
3727+ QObject(parent),
3728+ d_ptr(new ConnectionPrivate(this))
3729+{
3730+}
3731+
3732+Connection::~Connection()
3733+{
3734+}
3735+
3736+bool Connection::open()
3737+{
3738+ Q_D(Connection);
3739+ return d->open();
3740+}
3741+
3742+void Connection::postMessage(const QVariantMap &message)
3743+{
3744+ Q_D(Connection);
3745+
3746+ QJsonDocument doc = QJsonDocument::fromVariant(message);
3747+ QByteArray json = doc.toJson();
3748+ quint32 length = json.length();
3749+ d->m_writeChannel.write((char *)&length, sizeof(length));
3750+ d->m_writeChannel.write(json);
3751+ d->m_writeChannel.flush();
3752+}
3753+
3754+#include "connection.moc"
3755
3756=== added file 'messaging-host/connection.h'
3757--- messaging-host/connection.h 1970-01-01 00:00:00 +0000
3758+++ messaging-host/connection.h 2015-01-19 16:40:00 +0000
3759@@ -0,0 +1,52 @@
3760+/*
3761+ * Copyright (C) 2014 Canonical Ltd.
3762+ *
3763+ * This file is part of unity-chromium-extension
3764+ *
3765+ * This program is free software: you can redistribute it and/or modify it
3766+ * under the terms of the GNU General Public License version 3, as published
3767+ * by the Free Software Foundation.
3768+ *
3769+ * This program is distributed in the hope that it will be useful, but
3770+ * WITHOUT ANY WARRANTY; without even the implied warranties of
3771+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3772+ * PURPOSE. See the GNU General Public License for more details.
3773+ *
3774+ * You should have received a copy of the GNU General Public License along
3775+ * with this program. If not, see <http://www.gnu.org/licenses/>.
3776+ */
3777+
3778+#ifndef UNITY_WEBAPPS_CONNECTION
3779+#define UNITY_WEBAPPS_CONNECTION
3780+
3781+#include <QObject>
3782+#include <QVariantMap>
3783+
3784+namespace UnityWebapps {
3785+
3786+class ConnectionPrivate;
3787+
3788+class Connection: public QObject
3789+{
3790+ Q_OBJECT
3791+
3792+public:
3793+ explicit Connection(QObject *parent = 0);
3794+ ~Connection();
3795+
3796+ bool open();
3797+
3798+public Q_SLOTS:
3799+ void postMessage(const QVariantMap &message);
3800+
3801+Q_SIGNALS:
3802+ void messageReceived(const QVariantMap &message);
3803+
3804+private:
3805+ ConnectionPrivate *d_ptr;
3806+ Q_DECLARE_PRIVATE(Connection)
3807+};
3808+
3809+} // namespace
3810+
3811+#endif // UNITY_WEBAPPS_CONNECTION
3812
3813=== added file 'messaging-host/inactivity-timer.cpp'
3814--- messaging-host/inactivity-timer.cpp 1970-01-01 00:00:00 +0000
3815+++ messaging-host/inactivity-timer.cpp 2015-01-19 16:40:00 +0000
3816@@ -0,0 +1,65 @@
3817+/*
3818+ * Copyright (C) 2014 Canonical Ltd.
3819+ *
3820+ * This file is part of unity-chromium-extension
3821+ *
3822+ * This program is free software: you can redistribute it and/or modify it
3823+ * under the terms of the GNU General Public License version 3, as published
3824+ * by the Free Software Foundation.
3825+ *
3826+ * This program is distributed in the hope that it will be useful, but
3827+ * WITHOUT ANY WARRANTY; without even the implied warranties of
3828+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3829+ * PURPOSE. See the GNU General Public License for more details.
3830+ *
3831+ * You should have received a copy of the GNU General Public License along
3832+ * with this program. If not, see <http://www.gnu.org/licenses/>.
3833+ */
3834+
3835+#include "inactivity-timer.h"
3836+
3837+#include <QVariant>
3838+
3839+using namespace UnityWebapps;
3840+
3841+InactivityTimer::InactivityTimer(int interval, QObject *parent):
3842+ QObject(parent),
3843+ m_interval(interval)
3844+{
3845+ m_timer.setSingleShot(true);
3846+ QObject::connect(&m_timer, SIGNAL(timeout()),
3847+ this, SLOT(onTimeout()));
3848+}
3849+
3850+void InactivityTimer::watchObject(QObject *object)
3851+{
3852+ connect(object, SIGNAL(isIdleChanged()), SLOT(onIdleChanged()));
3853+ m_watchedObjects.append(object);
3854+
3855+ /* Force an initial check */
3856+ onIdleChanged();
3857+}
3858+
3859+void InactivityTimer::onIdleChanged()
3860+{
3861+ if (allObjectsAreIdle()) {
3862+ m_timer.start(m_interval);
3863+ }
3864+}
3865+
3866+void InactivityTimer::onTimeout()
3867+{
3868+ if (allObjectsAreIdle()) {
3869+ Q_EMIT timeout();
3870+ }
3871+}
3872+
3873+bool InactivityTimer::allObjectsAreIdle() const
3874+{
3875+ foreach (const QObject *object, m_watchedObjects) {
3876+ if (!object->property("isIdle").toBool()) {
3877+ return false;
3878+ }
3879+ }
3880+ return true;
3881+}
3882
3883=== added file 'messaging-host/inactivity-timer.h'
3884--- messaging-host/inactivity-timer.h 1970-01-01 00:00:00 +0000
3885+++ messaging-host/inactivity-timer.h 2015-01-19 16:40:00 +0000
3886@@ -0,0 +1,56 @@
3887+/*
3888+ * Copyright (C) 2014 Canonical Ltd.
3889+ *
3890+ * This file is part of unity-chromium-extension
3891+ *
3892+ * This program is free software: you can redistribute it and/or modify it
3893+ * under the terms of the GNU General Public License version 3, as published
3894+ * by the Free Software Foundation.
3895+ *
3896+ * This program is distributed in the hope that it will be useful, but
3897+ * WITHOUT ANY WARRANTY; without even the implied warranties of
3898+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3899+ * PURPOSE. See the GNU General Public License for more details.
3900+ *
3901+ * You should have received a copy of the GNU General Public License along
3902+ * with this program. If not, see <http://www.gnu.org/licenses/>.
3903+ */
3904+
3905+#ifndef UNITY_WEBAPPS_INACTIVITY_TIMER_H
3906+#define UNITY_WEBAPPS_INACTIVITY_TIMER_H
3907+
3908+#include <QList>
3909+#include <QObject>
3910+#include <QTimer>
3911+
3912+namespace UnityWebapps {
3913+
3914+class InactivityTimer: public QObject
3915+{
3916+ Q_OBJECT
3917+
3918+public:
3919+ InactivityTimer(int interval, QObject *parent = 0);
3920+ ~InactivityTimer() {}
3921+
3922+ void watchObject(QObject *object);
3923+
3924+Q_SIGNALS:
3925+ void timeout();
3926+
3927+private Q_SLOTS:
3928+ void onIdleChanged();
3929+ void onTimeout();
3930+
3931+private:
3932+ bool allObjectsAreIdle() const;
3933+
3934+private:
3935+ QList<QObject*> m_watchedObjects;
3936+ QTimer m_timer;
3937+ int m_interval;
3938+};
3939+
3940+} // namespace
3941+
3942+#endif // UNITY_WEBAPPS_INACTIVITY_TIMER_H
3943
3944=== added file 'messaging-host/main.cpp'
3945--- messaging-host/main.cpp 1970-01-01 00:00:00 +0000
3946+++ messaging-host/main.cpp 2015-01-19 16:40:00 +0000
3947@@ -0,0 +1,91 @@
3948+/*
3949+ * Copyright (C) 2014 Canonical Ltd.
3950+ *
3951+ * This file is part of unity-chromium-extension
3952+ *
3953+ * This program is free software: you can redistribute it and/or modify it
3954+ * under the terms of the GNU General Public License version 3, as published
3955+ * by the Free Software Foundation.
3956+ *
3957+ * This program is distributed in the hope that it will be useful, but
3958+ * WITHOUT ANY WARRANTY; without even the implied warranties of
3959+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
3960+ * PURPOSE. See the GNU General Public License for more details.
3961+ *
3962+ * You should have received a copy of the GNU General Public License along
3963+ * with this program. If not, see <http://www.gnu.org/licenses/>.
3964+ */
3965+
3966+#include <syslog.h>
3967+
3968+#include "connection.h"
3969+#include "inactivity-timer.h"
3970+#include "service.h"
3971+#include "webapps-handler.h"
3972+#include "webapps-process.h"
3973+
3974+#include <QCoreApplication>
3975+#include <QDebug>
3976+
3977+
3978+void syslogOutputHandler(QtMsgType type, const QMessageLogContext &, const QString &msg)
3979+{
3980+ QByteArray localMsg = msg.toLocal8Bit();
3981+ int syslog_type = LOG_USER;
3982+ switch (type) {
3983+ case QtDebugMsg:
3984+ syslog_type |= LOG_DEBUG;
3985+ break;
3986+ case QtWarningMsg:
3987+ syslog_type |= LOG_WARNING;
3988+ break;
3989+ case QtCriticalMsg:
3990+ syslog_type |= LOG_CRIT;
3991+ break;
3992+ case QtFatalMsg:
3993+ syslog_type |= LOG_ERR;
3994+ break;
3995+ }
3996+
3997+ syslog(syslog_type, "%s", localMsg.constData());
3998+}
3999+
4000+
4001+int main(int argc, char **argv)
4002+{
4003+ if (qgetenv("UNITY_WEBAPPS_LOGGING") == QByteArrayLiteral("1")) {
4004+ qInstallMessageHandler(syslogOutputHandler);
4005+ }
4006+
4007+ qDebug() << "Starting";
4008+
4009+ QCoreApplication app(argc, argv);
4010+
4011+ UnityWebapps::Process process;
4012+
4013+ UnityWebapps::Service service;
4014+ UnityWebapps::WebappsHandler handler;
4015+ service.addHandler(&handler);
4016+
4017+ UnityWebapps::InactivityTimer inactivityTimer(2 * 60 * 1000);
4018+ QObject::connect(&inactivityTimer, SIGNAL(timeout()), &app, SLOT(quit()));
4019+ inactivityTimer.watchObject(&service);
4020+
4021+ UnityWebapps::Connection connection;
4022+ QObject::connect(&connection, SIGNAL(messageReceived(const QVariantMap &)),
4023+ &service, SLOT(handleMessage(const QVariantMap &)));
4024+ QObject::connect(&service, SIGNAL(messageHandled(const QVariantMap &)),
4025+ &connection, SLOT(postMessage(const QVariantMap &)));
4026+ bool ok = connection.open();
4027+ if (Q_UNLIKELY(!ok)) {
4028+ qCritical() << "Couldn't open connection";
4029+ return EXIT_FAILURE;
4030+ }
4031+
4032+ int r = app.exec();
4033+
4034+ qDebug() << "Finishing";
4035+
4036+ return r;
4037+}
4038+
4039
4040=== added file 'messaging-host/messaging-host.pro'
4041--- messaging-host/messaging-host.pro 1970-01-01 00:00:00 +0000
4042+++ messaging-host/messaging-host.pro 2015-01-19 16:40:00 +0000
4043@@ -0,0 +1,42 @@
4044+include(../common-project-config.pri)
4045+
4046+TEMPLATE = app
4047+TARGET = unity-webapps-messaging-host
4048+
4049+CONFIG += \
4050+ link_pkgconfig \
4051+ qt
4052+
4053+QT += \
4054+ core
4055+
4056+PKGCONFIG += \
4057+ glib-2.0 \
4058+ gobject-2.0 \
4059+ libunity_webapps-0.2 \
4060+ libunity-webapps-repository \
4061+
4062+SOURCES = \
4063+ connection.cpp \
4064+ inactivity-timer.cpp \
4065+ main.cpp \
4066+ service.cpp \
4067+ webapps-handler.cpp \
4068+ webapps-process.cpp \
4069+
4070+HEADERS = \
4071+ connection.h \
4072+ inactivity-timer.h \
4073+ service.h \
4074+ webapps-handler.h \
4075+ webapps-process.h \
4076+
4077+target.path = $${INSTALL_PREFIX}/share/unity-webapps/bin
4078+INSTALLS += target
4079+
4080+QMAKE_SUBSTITUTES += \
4081+ com.canonical.webapp.installer.json.in
4082+
4083+manifest.path = "/etc/chromium/native-messaging-hosts"
4084+manifest.files = com.canonical.webapp.installer.json
4085+INSTALLS += manifest
4086
4087=== added file 'messaging-host/service.cpp'
4088--- messaging-host/service.cpp 1970-01-01 00:00:00 +0000
4089+++ messaging-host/service.cpp 2015-01-19 16:40:00 +0000
4090@@ -0,0 +1,120 @@
4091+/*
4092+ * Copyright (C) 2014 Canonical Ltd.
4093+ *
4094+ * This file is part of unity-chromium-extension
4095+ *
4096+ * This program is free software: you can redistribute it and/or modify it
4097+ * under the terms of the GNU General Public License version 3, as published
4098+ * by the Free Software Foundation.
4099+ *
4100+ * This program is distributed in the hope that it will be useful, but
4101+ * WITHOUT ANY WARRANTY; without even the implied warranties of
4102+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
4103+ * PURPOSE. See the GNU General Public License for more details.
4104+ *
4105+ * You should have received a copy of the GNU General Public License along
4106+ * with this program. If not, see <http://www.gnu.org/licenses/>.
4107+ */
4108+
4109+#include "service.h"
4110+
4111+#include <QDebug>
4112+#include <QList>
4113+#include <QMetaMethod>
4114+#include <QMetaObject>
4115+
4116+using namespace UnityWebapps;
4117+
4118+namespace UnityWebapps {
4119+
4120+class ServicePrivate
4121+{
4122+ Q_DECLARE_PUBLIC(Service)
4123+
4124+public:
4125+ inline ServicePrivate(Service *service);
4126+ inline ~ServicePrivate();
4127+
4128+ void setIdle(bool isIdle);
4129+
4130+private:
4131+ QList<QObject *> m_handlers;
4132+ bool m_isIdle;
4133+ mutable Service *q_ptr;
4134+};
4135+
4136+} // namespace
4137+
4138+ServicePrivate::ServicePrivate(Service *service):
4139+ m_isIdle(true),
4140+ q_ptr(service)
4141+{
4142+}
4143+
4144+ServicePrivate::~ServicePrivate()
4145+{
4146+}
4147+
4148+void ServicePrivate::setIdle(bool isIdle)
4149+{
4150+ Q_Q(Service);
4151+
4152+ if (m_isIdle == isIdle) return;
4153+ m_isIdle = isIdle;
4154+ Q_EMIT q->isIdleChanged();
4155+}
4156+
4157+Service::Service(QObject *parent):
4158+ QObject(parent),
4159+ d_ptr(new ServicePrivate(this))
4160+{
4161+}
4162+
4163+Service::~Service()
4164+{
4165+ delete d_ptr;
4166+}
4167+
4168+bool Service::isIdle() const {
4169+ Q_D(const Service);
4170+ return d->m_isIdle;
4171+}
4172+
4173+void Service::addHandler(QObject *handler)
4174+{
4175+ Q_D(Service);
4176+
4177+ d->m_handlers.append(handler);
4178+}
4179+
4180+void Service::handleMessage(const QVariantMap &message)
4181+{
4182+ Q_D(Service);
4183+
4184+ QByteArray method = message.value(QStringLiteral("method")).toString().toLatin1();
4185+ if (Q_UNLIKELY(method.isEmpty())) return;
4186+
4187+ QByteArray methodSignature = method + "(QVariantMap)";
4188+
4189+ d->setIdle(false);
4190+
4191+ QVariantMap reply;
4192+ bool ok = false;
4193+ Q_FOREACH(QObject *handler, d->m_handlers) {
4194+ const QMetaObject *metaObject = handler->metaObject();
4195+ int index = metaObject->indexOfMethod(methodSignature);
4196+ if (index == -1) continue;
4197+
4198+ QMetaMethod metaMethod = metaObject->method(index);
4199+ ok = metaMethod.invoke(handler,
4200+ Q_RETURN_ARG(QVariantMap, reply),
4201+ Q_ARG(QVariantMap, message));
4202+ if (ok) break;
4203+ }
4204+
4205+ if (ok) {
4206+ Q_EMIT messageHandled(reply);
4207+ }
4208+
4209+ d->setIdle(true);
4210+}
4211
4212=== added file 'messaging-host/service.h'
4213--- messaging-host/service.h 1970-01-01 00:00:00 +0000
4214+++ messaging-host/service.h 2015-01-19 16:40:00 +0000
4215@@ -0,0 +1,56 @@
4216+/*
4217+ * Copyright (C) 2014 Canonical Ltd.
4218+ *
4219+ * This file is part of unity-chromium-extension
4220+ *
4221+ * This program is free software: you can redistribute it and/or modify it
4222+ * under the terms of the GNU General Public License version 3, as published
4223+ * by the Free Software Foundation.
4224+ *
4225+ * This program is distributed in the hope that it will be useful, but
4226+ * WITHOUT ANY WARRANTY; without even the implied warranties of
4227+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
4228+ * PURPOSE. See the GNU General Public License for more details.
4229+ *
4230+ * You should have received a copy of the GNU General Public License along
4231+ * with this program. If not, see <http://www.gnu.org/licenses/>.
4232+ */
4233+
4234+#ifndef UNITY_WEBAPPS_SERVICE
4235+#define UNITY_WEBAPPS_SERVICE
4236+
4237+#include <QObject>
4238+#include <QVariantMap>
4239+
4240+namespace UnityWebapps {
4241+
4242+class ServicePrivate;
4243+
4244+class Service: public QObject
4245+{
4246+ Q_OBJECT
4247+ Q_PROPERTY(bool isIdle READ isIdle NOTIFY isIdleChanged)
4248+
4249+public:
4250+ explicit Service(QObject *parent = 0);
4251+ ~Service();
4252+
4253+ bool isIdle() const;
4254+
4255+ void addHandler(QObject *handler);
4256+
4257+public Q_SLOTS:
4258+ void handleMessage(const QVariantMap &message);
4259+
4260+Q_SIGNALS:
4261+ void messageHandled(const QVariantMap &reply);
4262+ void isIdleChanged();
4263+
4264+private:
4265+ ServicePrivate *d_ptr;
4266+ Q_DECLARE_PRIVATE(Service)
4267+};
4268+
4269+} // namespace
4270+
4271+#endif // UNITY_WEBAPPS_SERVICE
4272
4273=== added file 'messaging-host/webapps-handler.cpp'
4274--- messaging-host/webapps-handler.cpp 1970-01-01 00:00:00 +0000
4275+++ messaging-host/webapps-handler.cpp 2015-01-19 16:40:00 +0000
4276@@ -0,0 +1,324 @@
4277+/*
4278+ * Copyright (C) 2014 Canonical Ltd.
4279+ *
4280+ * This file is part of unity-chromium-extension
4281+ *
4282+ * This program is free software: you can redistribute it and/or modify it
4283+ * under the terms of the GNU General Public License version 3, as published
4284+ * by the Free Software Foundation.
4285+ *
4286+ * This program is distributed in the hope that it will be useful, but
4287+ * WITHOUT ANY WARRANTY; without even the implied warranties of
4288+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
4289+ * PURPOSE. See the GNU General Public License for more details.
4290+ *
4291+ * You should have received a copy of the GNU General Public License along
4292+ * with this program. If not, see <http://www.gnu.org/licenses/>.
4293+ */
4294+
4295+extern "C" {
4296+#include <unity-webapps-permissions.h>
4297+#include <unity-webapps-application-repository.h>
4298+}
4299+
4300+#include "webapps-handler.h"
4301+
4302+#include <QDebug>
4303+#include <QRegularExpression>
4304+
4305+
4306+using namespace UnityWebapps;
4307+
4308+namespace UnityWebapps {
4309+
4310+class WebappsHandlerPrivate
4311+{
4312+ Q_DECLARE_PUBLIC(WebappsHandler)
4313+
4314+public:
4315+ inline WebappsHandlerPrivate(WebappsHandler *service);
4316+ inline ~WebappsHandlerPrivate();
4317+
4318+ UnityWebappsApplicationRepository *getRepository();
4319+
4320+private:
4321+ static
4322+ void installationCallback(UnityWebappsApplicationRepository *repository,
4323+ const gchar *name,
4324+ UnityWebappsApplicationStatus status,
4325+ gpointer user_data);
4326+
4327+ mutable WebappsHandler *q_ptr;
4328+ UnityWebappsApplicationRepository *applicationRepository;
4329+};
4330+
4331+} // namespace
4332+
4333+
4334+WebappsHandlerPrivate::WebappsHandlerPrivate(WebappsHandler *service):
4335+ q_ptr(service),
4336+ applicationRepository(0)
4337+{
4338+}
4339+
4340+WebappsHandlerPrivate::~WebappsHandlerPrivate()
4341+{
4342+ if (applicationRepository != 0) {
4343+ g_object_unref(G_OBJECT(applicationRepository));
4344+ }
4345+}
4346+
4347+UnityWebappsApplicationRepository *WebappsHandlerPrivate::getRepository()
4348+{
4349+ if (applicationRepository == 0) {
4350+ applicationRepository = unity_webapps_application_repository_new_default();
4351+ unity_webapps_application_repository_prepare(applicationRepository);
4352+ }
4353+ return applicationRepository;
4354+}
4355+
4356+void WebappsHandlerPrivate::installationCallback(
4357+ UnityWebappsApplicationRepository *repository,
4358+ const gchar *name,
4359+ UnityWebappsApplicationStatus status,
4360+ gpointer user_data
4361+)
4362+{
4363+ Q_UNUSED(repository);
4364+ Q_UNUSED(name);
4365+ Q_UNUSED(status);
4366+ Q_UNUSED(user_data);
4367+}
4368+
4369+
4370+WebappsHandler::WebappsHandler(QObject *parent):
4371+ QObject(parent),
4372+ d_ptr(new WebappsHandlerPrivate(this))
4373+{
4374+}
4375+
4376+WebappsHandler::~WebappsHandler()
4377+{
4378+ delete d_ptr;
4379+}
4380+
4381+QVariantMap WebappsHandler::url_loaded(const QVariantMap &message)
4382+{
4383+ Q_D(WebappsHandler);
4384+
4385+ QVariantMap reply;
4386+
4387+ if (!message.contains("url")) {
4388+ reply.insert("error", QStringLiteral("malformed request"));
4389+ return reply;
4390+ }
4391+
4392+ QString url = message.value("url").toString();
4393+
4394+ GList *apps = unity_webapps_application_repository_resolve_url(
4395+ d->getRepository(),
4396+ url.toLocal8Bit().constData()
4397+ );
4398+
4399+ if (apps == 0) {
4400+ reply.insert("available", false);
4401+ return reply;
4402+ }
4403+
4404+ // As per original extension only look at the first entry
4405+ const gchar *packageName = (const gchar*)apps->data;
4406+ UnityWebappsApplicationStatus status = unity_webapps_application_repository_get_resolved_application_status(
4407+ d->getRepository(),
4408+ packageName);
4409+
4410+ if (status == UNITY_WEBAPPS_APPLICATION_STATUS_UNRESOLVED) {
4411+ reply.insert("available", false);
4412+ g_list_free_full(apps, g_free);
4413+ return reply;
4414+ }
4415+
4416+ const gchar *appName = unity_webapps_application_repository_get_resolved_application_name(
4417+ d->getRepository(),
4418+ packageName);
4419+
4420+ const gchar *appDomain = unity_webapps_application_repository_get_resolved_application_domain(
4421+ d->getRepository(),
4422+ packageName);
4423+
4424+ if (unity_webapps_permissions_get_domain_dontask(appDomain) ||
4425+ unity_webapps_permissions_get_domain_allowed(appDomain)) {
4426+ reply.insert("available", false);
4427+ g_list_free_full(apps, g_free);
4428+ return reply;
4429+ }
4430+
4431+ reply.insert("available", true);
4432+ reply.insert("appName", QString::fromUtf8(appName));
4433+ reply.insert("appDomain", QString::fromUtf8(appDomain));
4434+
4435+ g_list_free_full(apps, g_free);
4436+
4437+ return reply;
4438+}
4439+
4440+QVariantMap WebappsHandler::dont_ask(const QVariantMap &message)
4441+{
4442+ Q_D(WebappsHandler);
4443+
4444+ QVariantMap reply;
4445+
4446+ if (!message.contains("url")) {
4447+ reply.insert("error", QLatin1String("malformed request"));
4448+ return reply;
4449+ }
4450+
4451+ QString url = message.value("url").toString();
4452+
4453+ GList *apps = unity_webapps_application_repository_resolve_url(
4454+ d->getRepository(),
4455+ url.toLocal8Bit().constData()
4456+ );
4457+
4458+ if (apps == 0) {
4459+ reply.insert("available", false);
4460+ reply.insert("dont_ask", false);
4461+ return reply;
4462+ }
4463+
4464+ const gchar *packageName = (const gchar*)apps->data;
4465+
4466+ const gchar *appDomain = unity_webapps_application_repository_get_resolved_application_domain(
4467+ d->getRepository(),
4468+ packageName);
4469+
4470+ unity_webapps_permissions_dontask_domain(appDomain);
4471+
4472+ reply.insert("dont_ask", true);
4473+
4474+ g_list_free_full(apps, g_free);
4475+
4476+ return reply;
4477+}
4478+
4479+QVariantMap WebappsHandler::install(const QVariantMap &message)
4480+{
4481+ Q_D(WebappsHandler);
4482+
4483+ QVariantMap reply;
4484+
4485+ if (!message.contains("url")) {
4486+ reply.insert("error", QLatin1String("malformed request"));
4487+ return reply;
4488+ }
4489+
4490+ QString url = message.value("url").toString();
4491+
4492+ GList *apps = unity_webapps_application_repository_resolve_url(
4493+ d->getRepository(),
4494+ url.toLocal8Bit().constData()
4495+ );
4496+
4497+ if (apps == 0) {
4498+ reply.insert("available", false);
4499+ reply.insert("installed", false);
4500+ return reply;
4501+ }
4502+
4503+ const gchar *packageName = (const gchar*)apps->data;
4504+
4505+ UnityWebappsApplicationStatus status = unity_webapps_application_repository_get_resolved_application_status(
4506+ d->getRepository(),
4507+ packageName);
4508+
4509+ if (status == UNITY_WEBAPPS_APPLICATION_STATUS_UNRESOLVED) {
4510+ reply.insert("available", false);
4511+ reply.insert("installed", false);
4512+ g_list_free_full(apps, g_free);
4513+ return reply;
4514+ }
4515+
4516+ const gchar *appDomain = unity_webapps_application_repository_get_resolved_application_domain(
4517+ d->getRepository(),
4518+ packageName);
4519+ const gchar *appName = unity_webapps_application_repository_get_resolved_application_name(
4520+ d->getRepository(),
4521+ packageName);
4522+
4523+ switch (status) {
4524+ case UNITY_WEBAPPS_APPLICATION_STATUS_AVAILABLE:
4525+ if (unity_webapps_permissions_get_domain_dontask(appDomain)) {
4526+ reply.insert("available", true);
4527+ reply.insert("installed", false);
4528+ g_list_free_full(apps, g_free);
4529+ return reply;
4530+ }
4531+ unity_webapps_permissions_allow_domain(appDomain);
4532+ unity_webapps_application_repository_install_application(
4533+ d->getRepository(),
4534+ packageName,
4535+ WebappsHandlerPrivate::installationCallback,
4536+ 0);
4537+ break;
4538+
4539+ case UNITY_WEBAPPS_APPLICATION_STATUS_INSTALLED:
4540+ if (unity_webapps_permissions_get_domain_dontask(appDomain) ||
4541+ unity_webapps_permissions_get_domain_allowed(appDomain)) {
4542+ reply.insert("available", true);
4543+ reply.insert("installed", true);
4544+ g_list_free_full(apps, g_free);
4545+ return reply;
4546+ }
4547+ unity_webapps_application_repository_add_desktop_to_launcher(
4548+ createApplicationDesktopName(appName, appDomain).toLocal8Bit()
4549+ );
4550+ unity_webapps_permissions_allow_domain(appDomain);
4551+ break;
4552+ case UNITY_WEBAPPS_APPLICATION_STATUS_UNRESOLVED:
4553+ // handled above
4554+ break;
4555+ }
4556+
4557+ reply.insert("installed", true);
4558+
4559+ g_list_free_full(apps, g_free);
4560+
4561+ return reply;
4562+}
4563+
4564+QVariantMap WebappsHandler::ping(const QVariantMap &message)
4565+{
4566+ Q_UNUSED(message);
4567+
4568+ QVariantMap reply;
4569+
4570+ reply.insert("pong", QLatin1String("alive"));
4571+
4572+ return reply;
4573+}
4574+
4575+/*
4576+ \fn createApplicationDesktopName(QString, QString)
4577+
4578+ This function creates a application:// URI suitable for passing to
4579+ unity_webapps_application_repository_add_desktop_to_launcher().
4580+
4581+ To add the webapp's icon to the launcher, a dbus message is sent to the
4582+ launcher, referencing the webapps canonical .desktop file name. This
4583+ function creates the canonical name and returns it in the URI form.
4584+*/
4585+
4586+QString WebappsHandler::createApplicationDesktopName(
4587+ const QString &appName,
4588+ const QString &appDomain
4589+) const
4590+{
4591+ QString basename;
4592+ QRegularExpression re(QStringLiteral("[^[:alnum:]]"),
4593+ QRegularExpression::UseUnicodePropertiesOption);
4594+
4595+ basename.append(appName.trimmed().replace(re, QStringLiteral("")));
4596+ basename.append(appDomain.trimmed().replace(re, QStringLiteral("")));
4597+
4598+ return QStringLiteral("application://%1.desktop").arg(basename);
4599+}
4600+
4601
4602=== added file 'messaging-host/webapps-handler.h'
4603--- messaging-host/webapps-handler.h 1970-01-01 00:00:00 +0000
4604+++ messaging-host/webapps-handler.h 2015-01-19 16:40:00 +0000
4605@@ -0,0 +1,59 @@
4606+/*
4607+ * Copyright (C) 2014 Canonical Ltd.
4608+ *
4609+ * This file is part of unity-chromium-extension
4610+ *
4611+ * This program is free software: you can redistribute it and/or modify it
4612+ * under the terms of the GNU General Public License version 3, as published
4613+ * by the Free Software Foundation.
4614+ *
4615+ * This program is distributed in the hope that it will be useful, but
4616+ * WITHOUT ANY WARRANTY; without even the implied warranties of
4617+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
4618+ * PURPOSE. See the GNU General Public License for more details.
4619+ *
4620+ * You should have received a copy of the GNU General Public License along
4621+ * with this program. If not, see <http://www.gnu.org/licenses/>.
4622+ */
4623+
4624+#ifndef UNITY_WEBAPPS_WEBAPPS_HANDLER
4625+#define UNITY_WEBAPPS_WEBAPPS_HANDLER
4626+
4627+#include <QObject>
4628+#include <QVariantMap>
4629+
4630+namespace UnityWebapps {
4631+
4632+class WebappsHandlerPrivate;
4633+
4634+class WebappsHandler: public QObject
4635+{
4636+ Q_OBJECT
4637+
4638+public:
4639+ explicit WebappsHandler(QObject *parent = 0);
4640+ ~WebappsHandler();
4641+
4642+public Q_SLOTS:
4643+ QVariantMap url_loaded(const QVariantMap &message);
4644+ QVariantMap dont_ask(const QVariantMap &message);
4645+ QVariantMap install(const QVariantMap &message);
4646+ QVariantMap ping(const QVariantMap &message);
4647+
4648+#if defined(UCX_UNDER_TEST)
4649+public:
4650+#else
4651+private:
4652+#endif
4653+ QString createApplicationDesktopName(
4654+ const QString &appName,
4655+ const QString &appDomain
4656+ ) const;
4657+
4658+ WebappsHandlerPrivate *d_ptr;
4659+ Q_DECLARE_PRIVATE(WebappsHandler)
4660+};
4661+
4662+} // namespace
4663+
4664+#endif // UNITY_WEBAPPS_WEBAPPS_HANDLER
4665
4666=== added file 'messaging-host/webapps-process.cpp'
4667--- messaging-host/webapps-process.cpp 1970-01-01 00:00:00 +0000
4668+++ messaging-host/webapps-process.cpp 2015-01-19 16:40:00 +0000
4669@@ -0,0 +1,28 @@
4670+
4671+extern "C" {
4672+#include <unity-webapps-service.h>
4673+}
4674+
4675+#include "webapps-process.h"
4676+
4677+namespace UnityWebapps {
4678+
4679+class ProcessPrivate
4680+{
4681+public:
4682+ UnityWebappsService *service;
4683+};
4684+
4685+Process::Process():
4686+ d_ptr(new ProcessPrivate)
4687+{
4688+ d_ptr->service = unity_webapps_service_new();
4689+}
4690+
4691+Process::~Process()
4692+{
4693+ g_object_unref(d_ptr->service);
4694+ delete d_ptr;
4695+}
4696+
4697+}
4698
4699=== added file 'messaging-host/webapps-process.h'
4700--- messaging-host/webapps-process.h 1970-01-01 00:00:00 +0000
4701+++ messaging-host/webapps-process.h 2015-01-19 16:40:00 +0000
4702@@ -0,0 +1,37 @@
4703+/*
4704+ * Copyright (C) 2014 Canonical Ltd.
4705+ *
4706+ * This file is part of unity-chromium-extension
4707+ *
4708+ * This program is free software: you can redistribute it and/or modify it
4709+ * under the terms of the GNU General Public License version 3, as published
4710+ * by the Free Software Foundation.
4711+ *
4712+ * This program is distributed in the hope that it will be useful, but
4713+ * WITHOUT ANY WARRANTY; without even the implied warranties of
4714+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
4715+ * PURPOSE. See the GNU General Public License for more details.
4716+ *
4717+ * You should have received a copy of the GNU General Public License along
4718+ * with this program. If not, see <http://www.gnu.org/licenses/>.
4719+ */
4720+
4721+#ifndef UNITY_WEBAPPS_PROCESS
4722+#define UNITY_WEBAPPS_PROCESS
4723+
4724+namespace UnityWebapps {
4725+
4726+class ProcessPrivate;
4727+class Process
4728+{
4729+public:
4730+ Process();
4731+ ~Process();
4732+
4733+private:
4734+ ProcessPrivate *d_ptr;
4735+};
4736+
4737+} // namespace
4738+
4739+#endif // UNITY_WEBAPPS_SERVICE
4740
4741=== removed directory 'npapi-binding-gen'
4742=== removed file 'npapi-binding-gen/bindinggen.py'
4743--- npapi-binding-gen/bindinggen.py 2012-07-17 19:22:35 +0000
4744+++ npapi-binding-gen/bindinggen.py 1970-01-01 00:00:00 +0000
4745@@ -1,203 +0,0 @@
4746-import sys
4747-import os
4748-try:
4749- import headers
4750- import parser
4751-except Exception, e:
4752- print e
4753- sys.exit(1)
4754-
4755-def _get_candidates_for_header_file_gen (files):
4756- """
4757- Takes a list of files (header files) and returns a list of files
4758- that should be considered for "webapps binding" generation
4759- """
4760- candidates = [file for file in files if file.endswith('-context.h')
4761- and -1 == file.find('-gen-')
4762- or file.endswith('webapps-service.h')
4763- or file.endswith('script-repo.h')]
4764- return candidates
4765-
4766-def _get_source_file_body_template ():
4767- return """
4768-/*
4769- * unity-webapps-binding.c
4770- * Copyright (C) Canonical LTD 2012
4771- *
4772- * Author: Alexandre Abreu <alexandre.abreu@canonical.com>
4773- *
4774- * This program is free software; you can redistribute it and/or modify
4775- * it under the terms of the GNU General Public License as published by
4776- * the Free Software Foundation; either version 2 of the License, or
4777- * (at your option) any later version.
4778- *
4779- * This program is distributed in the hope that it will be useful,
4780- * but WITHOUT ANY WARRANTY; without even the implied warranty of
4781- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4782- * GNU General Public License for more details.
4783- *
4784- * You should have received a copy of the GNU General Public License
4785- * along with this program. If not, see <http://www.gnu.org/licenses/>.
4786- */
4787-#include <glib.h>
4788-
4789-#include <unity-webapps-service.h>
4790-#include <unity-webapps-context.h>
4791-#include <unity-webapps-music-player-context.h>
4792-#include <unity-webapps-permissions.h>
4793-#include <unity-webapps-launcher-context.h>
4794-#include <unity-webapps-notification-context.h>
4795-
4796-#include "npapi-headers/headers/npapi.h"
4797-#include "npapi-headers/headers/npfunctions.h"
4798-#include "npapi-headers/headers/npruntime.h"
4799-
4800-#include "wrapped-ptr-type.h"
4801-#include "wrapped-callback-type.h"
4802-#include "unity-webapps-binding-test.h"
4803-#include "unity-npapi-binding-utils.h"
4804-#include "unity-webapps-scriptable-object.h"
4805-#include "unity-webapps-repo-userscript-wrapper.h"
4806-#include "unity-npapi-plugin.h"
4807-
4808-#define REACHED_UNITY_WEBAPPS_FUNC_CALL() \
4809- if (unity_webapps_binding_test_is_test_mode_on()) \
4810- { \
4811- g_message("reached func call"); \
4812- unity_webapps_binding_test_reached_func_call (); \
4813- return result; \
4814- } \
4815- do {} while (false)
4816-
4817-#define ADD_NPOBJECT_RETAIN_FOR_CONTEXT(npp,context,object) \
4818- if (! unity_webapps_binding_test_is_test_mode_on()) \
4819- { \
4820- unity_npapi_plugin_t * pPlugin = (unity_npapi_plugin_t *) npp->pdata; \
4821- if (NULL != pPlugin) \
4822- { \
4823- unity_npapi_add_retained_objects_for_context (pPlugin,context,object); \
4824- } \
4825- }
4826-
4827-"""
4828-
4829-def _get_header_body_template ():
4830- return """
4831-/*
4832- * Copyright (C) Canonical LTD 2012
4833- *
4834- * Author: Alexandre Abreu <alexandre.abreu@canonical.com>
4835- *
4836- * This program is free software; you can redistribute it and/or modify
4837- * it under the terms of the GNU General Public License as published by
4838- * the Free Software Foundation; either version 2 of the License, or
4839- * (at your option) any later version.
4840- *
4841- * This program is distributed in the hope that it will be useful,
4842- * but WITHOUT ANY WARRANTY; without even the implied warranty of
4843- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4844- * GNU General Public License for more details.
4845- *
4846- * You should have received a copy of the GNU General Public License
4847- * along with this program. If not, see <http://www.gnu.org/licenses/>.
4848- */
4849-
4850-#if ! defined (UNITY_WEBAPPS_BINDING_H)
4851-#define UNITY_WEBAPPS_BINDING_H
4852-
4853-#include "npapi-headers/headers/npapi.h"
4854-#include "npapi-headers/headers/nptypes.h"
4855-
4856-%s
4857-
4858-#endif // UNITY_WEBAPPS_BINDING_H
4859-
4860-"""
4861-
4862-def _get_unittest_func_header_template():
4863- return """ #ifndef %s_TEST_H
4864-#define %s_TEST_H
4865-
4866-int %s_test(void);
4867-
4868-#endif
4869-"""
4870-
4871-def _get_function_defs (parsed_data):
4872- return [parsed_datum for parsed_datum in parsed_data if parsed_datum['type'] == 'func_decl']
4873-
4874-def _get_callback_typedefs (parsed_data):
4875- return [parsed_datum for parsed_datum in parsed_data if parsed_datum['type'] == 'func_typedef' and parsed_datum['name'][1].endswith('Callback')]
4876-
4877-if __name__ == "__main__":
4878- import sys
4879-
4880- import argparse
4881- parser = argparse.ArgumentParser(description='Generate NPAPI binding from header files.')
4882- parser.add_argument ('--outf', default='unity-webapps-npapi-binding')
4883- parser.add_argument ('--inf')
4884- args = parser.parse_args()
4885-
4886- outfilename = args.outf
4887- infilename = args.inf
4888-
4889- header_content = "// this file has been generated\n\n"
4890- source_content = "// this file has been generated\n\n" + _get_source_file_body_template()
4891-
4892- binding_headers = []
4893- if infilename is not None:
4894- import os
4895- if not os.path.exists(infilename):
4896- print "Invalid filename (does not exist):", infilename
4897- sys.exit(1)
4898- infilename = os.path.normpath (infilename)
4899- binding_headers = [infilename]
4900- else:
4901- header_file_path = headers.getLibHeaderFilesPath()
4902- if not os.path.exists(header_file_path):
4903- print "libunity-webapps not installed or found"
4904- sys.exit(1)
4905-
4906- binding_headers = _get_candidates_for_header_file_gen (headers.getHeaderFilesFrom (header_file_path))
4907- if len(binding_headers) == 0:
4908- print "nothing to do, no header found"
4909- sys.exit(1)
4910-
4911- # 'fix' the paths
4912- binding_headers = [os.path.join (header_file_path, binding_header) for binding_header in binding_headers]
4913-
4914- import common_gen
4915- import subprocess
4916- functions_to_generate = [common_gen.get_unity_webapps_function_prefix() + function_to_generate for function_to_generate in subprocess.check_output('./get_functions_to_generate.sh', shell=True).split()]
4917-
4918- import header_generator
4919- import source_generator
4920- import unittest_gen
4921-
4922- import prepasses
4923- import parser
4924- for binding_header in binding_headers:
4925- print "--- processing", binding_header
4926- parsed_data = parser.parse (prepasses.run_prepasses(open(binding_header).read()))
4927-
4928- callback_decls = _get_callback_typedefs (parsed_data)
4929- func_decls = _get_function_defs (parsed_data)
4930-
4931- # filter func defs
4932- func_decls = [func_decl for func_decl in func_decls if func_decl['name'][1] in functions_to_generate]
4933-
4934- # generate
4935- header_content += header_generator.generate_headers_for(func_decls)
4936- source_content += source_generator.generate_sources_for(func_decls, callback_decls)
4937-
4938- for func_decl in func_decls:
4939- unittest_content = unittest_gen.generate_unittest_for(func_decl)
4940- func_name = func_decl['name'][1]
4941- func_name_filename = func_name.replace('_', '-')
4942- open(func_name_filename + "-test.c", "w+").write(unittest_content)
4943- open(func_name_filename + "-test.h", "w+").write(_get_unittest_func_header_template() % (func_name.upper(), func_name.upper(), func_name))
4944-
4945- open(outfilename + '.h', 'w+').write (_get_header_body_template() % header_content)
4946- open(outfilename + '.c', 'w+').write (source_content)
4947-
4948-
4949
4950=== removed file 'npapi-binding-gen/common_gen.py'
4951--- npapi-binding-gen/common_gen.py 2012-06-04 14:04:32 +0000
4952+++ npapi-binding-gen/common_gen.py 1970-01-01 00:00:00 +0000
4953@@ -1,9 +0,0 @@
4954-"""
4955-"""
4956-
4957-def get_binding_function_prefix ():
4958- return "unity_webapps_binding_"
4959-
4960-def get_unity_webapps_function_prefix ():
4961- return "unity_webapps_"
4962-
4963
4964=== removed file 'npapi-binding-gen/get_functions_to_generate.sh'
4965--- npapi-binding-gen/get_functions_to_generate.sh 2012-06-04 14:04:32 +0000
4966+++ npapi-binding-gen/get_functions_to_generate.sh 1970-01-01 00:00:00 +0000
4967@@ -1,5 +0,0 @@
4968-#!/bin/bash
4969-
4970-set -e
4971-find ../chromium-extension -name *.js | xargs grep -Po "(uwa\.[\w_]*)" | awk -F":" '{ print $2 }' | awk -F"." '{print $2}' | tee functions_to_generate | cat
4972-
4973
4974=== removed file 'npapi-binding-gen/header_generator.py'
4975--- npapi-binding-gen/header_generator.py 2012-06-04 14:04:32 +0000
4976+++ npapi-binding-gen/header_generator.py 1970-01-01 00:00:00 +0000
4977@@ -1,23 +0,0 @@
4978-"""
4979-"""
4980-
4981-import common_gen
4982-
4983-def generate_headers_for(func_descriptions):
4984- func_decls = []
4985- for func_description in [func_description for func_description in func_descriptions if func_description['type'] == 'func_decl']:
4986- func_decls.append(_generate_header_for(func_description))
4987- return '\n'.join (func_decls)
4988-
4989-
4990-def _generate_header_for(func_description):
4991- return """
4992-NPVariant
4993-%s%s (NPP instance
4994- , NPObject * npobject
4995- , const NPVariant *args
4996- , uint32_t argCount);
4997-""" % (common_gen.get_binding_function_prefix (), func_description['name'][1].replace(common_gen.get_unity_webapps_function_prefix(), ''))
4998-
4999-
5000-
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: