mirror of https://github.com/vitalif/phantomjs
Compare commits
6 Commits
Author | SHA1 | Date |
---|---|---|
Ariya Hidayat | 67a9e77770 | |
Ariya Hidayat | 77a23343e5 | |
Ivan De Marino | cb02a3340f | |
Ariya Hidayat | 266a12bc11 | |
Ivan De Marino | abd7f73ee5 | |
Ariya Hidayat | 5a2f4879e8 |
|
@ -2,6 +2,7 @@
|
|||
*.pro.user*
|
||||
*.xcodeproj
|
||||
Makefile*
|
||||
bin/phantomjs
|
||||
*~
|
||||
*.moc
|
||||
moc_*
|
||||
|
@ -9,53 +10,13 @@ qrc_*
|
|||
*.o
|
||||
*.swp
|
||||
*.pyc
|
||||
*.a
|
||||
/debian/*.debhelper
|
||||
/debian/files
|
||||
/debian/*.log
|
||||
/debian/*.substvars
|
||||
/debian/*/
|
||||
debian/*.debhelper
|
||||
debian/files
|
||||
debian/*.log
|
||||
debian/*.substvars
|
||||
debian/*/
|
||||
/deploy/qt-*.tar.gz
|
||||
/deploy/Qt-*
|
||||
/symbols
|
||||
/src/qt/qtc-debugging-helper
|
||||
/src/phantomjs_plugin_import.cpp
|
||||
|
||||
# ignore ctags
|
||||
/tags
|
||||
/tools/dump_syms.app/
|
||||
|
||||
# Ignore Visual Studio temporary files, build results, etc
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.log
|
||||
*.sdf
|
||||
*.vcxproj
|
||||
*.vcxproj.filters
|
||||
*.lib
|
||||
*.prl
|
||||
*.intermediate.manifest
|
||||
|
||||
# Build results
|
||||
[Dd]ebug*/
|
||||
[Rr]elease/
|
||||
bin/
|
||||
*.class
|
||||
build/
|
||||
.gradle/
|
||||
|
|
29
.travis.yml
29
.travis.yml
|
@ -1,29 +0,0 @@
|
|||
language: cpp
|
||||
compiler:
|
||||
- gcc
|
||||
cache: apt
|
||||
|
||||
before_install:
|
||||
- sudo apt-get -yqq update #< Suggested by the Travis CI doc
|
||||
- sudo apt-get -fyq install #< Fixes inconsistency of packages installed previously
|
||||
|
||||
install:
|
||||
- sudo apt-get -yq install build-essential chrpath libssl-dev libfontconfig1-dev sqlite3 libsqlite3-dev ruby gperf bison flex libicu48 libicu-dev #< Build Dependencies
|
||||
|
||||
before_script:
|
||||
- chmod +x ./build.sh
|
||||
- chmod +x ./test/run-tests.sh
|
||||
- chmod +x ./test/run-tests-ghostdriver.sh
|
||||
|
||||
script:
|
||||
- ./build.sh --confirm --silent #< Build
|
||||
- ./test/run-tests.sh #< Test (PhantomJS)
|
||||
- ./test/run-tests-ghostdriver.sh #< Test (GhostDriver / PhantomJSDriver)
|
||||
|
||||
notifications:
|
||||
irc:
|
||||
channels:
|
||||
- "irc.freenode.org#phantomjs"
|
||||
on_success: always
|
||||
on_failure: always
|
||||
use_notice: true
|
|
@ -1,88 +0,0 @@
|
|||
# Contribution Guide
|
||||
|
||||
This page describes how to contribute changes to PhantomJS.
|
||||
|
||||
Please do **not** create a pull request without reading this guide first. Failure to do so may result in the **rejection** of the pull request.
|
||||
|
||||
## For The Impatients
|
||||
|
||||
**Work on a feature branch**.
|
||||
If your changes need to be modified due to some reviews, it is less clutter to tweak an isolated feature branch and push it again.
|
||||
|
||||
**Create a ticket in the issue tracker**.
|
||||
This serves as a placeholder for important feedback, review, or any future updates.
|
||||
|
||||
In the commit message:
|
||||
|
||||
* **Keep the first line < 72 characters**. Write additional paragraphs
|
||||
if necessary.
|
||||
* **Put the link to the issue** (see above). This is important for cross-referencing purposes.
|
||||
|
||||
## Communicate
|
||||
|
||||
*Second opinion is always important.*
|
||||
|
||||
**Bug fixing**. If you have a fix for a bug, please attach your patch in the corresponding issue in the [issue tracker](https://github.com/ariya/phantomjs/issues). If there is no entry for the bug yet, then please create a new one. If you are confident working with Git, see the Get Ready section below on how to submit your change.
|
||||
|
||||
**Improvement and feature request**. If you have an improvement idea, please send an email to the [mailing list](http://groups.google.com/group/phantomjs) (rather than contacting the developers directly) so that other people can give their insights and opinions. This is also important to avoid duplicate work.
|
||||
|
||||
**Task management**. Once the feature idea is agreed upon and translated into concrete actions and tasks, please use the [issue tracker](https://github.com/ariya/phantomjs/issues) to create an issue for each individual task. Further technical discussion about the task and the implementation details should be carried out in the issue tracker.
|
||||
|
||||
**Extending with new API**. Whenever you want to introduce a new API, please send an email to the mailing list along with the link to the issue. Consider good API name for the object or function, read the [API Design Principle](http://developer.qt.nokia.com/wiki/API_Design_Principles) article. It may require few iterations to agree on the final API and hence it is important to engage all interested parties as early as possible.
|
||||
|
||||
## Get Ready
|
||||
|
||||
For your proposed change, you need to have:
|
||||
|
||||
* **an issue** (in the issue tracker) which describe your bug or feature
|
||||
* **a feature branch** in your git fork
|
||||
|
||||
### Refer the Issue
|
||||
|
||||
The commit message needs to link to the issue. This cross-reference is [very important](http://ariya.ofilabs.com/2012/01/small-scale-software-craftsmanship.html) for the following reasons.
|
||||
|
||||
First, the commit log is frozen and can not be changed. If it contains a mistake or outdated information, the log can not be amended. However, further updates can be still posted to the linked issue, which can be followed from the commit log itself.
|
||||
|
||||
Second, it provides a placeholder for code review and other feedback.
|
||||
|
||||
An example of a bad commit log:
|
||||
|
||||
Fix Mountain Lion
|
||||
|
||||
The above log is too short and useless in the long run. A better version (and note the issue link):
|
||||
|
||||
Better support for OS X Mountain Lion.
|
||||
|
||||
require('system').os.version should give "10.8 (Mountain Lion)".
|
||||
|
||||
https://github.com/ariya/phantomjs/issues/10688
|
||||
|
||||
### Use Feature Branch
|
||||
|
||||
To isolate your change, please avoid working on the master branch. Instead, work on a *feature branch* (often also known as *topic branch*). You can create a new branch (example here crash-fix) off the master branch by using:
|
||||
|
||||
git checkout -b crash-fix master
|
||||
|
||||
Refer to your favorite Git tutorial/book for further detailed help.
|
||||
|
||||
Some good practices for the feature branch:
|
||||
|
||||
* Give it a meaningful name instead of, e.g. `prevent-zero-divide` instead of just `fix`
|
||||
* Make *granular* and *atomic* commits, e.g. do not mix a typo fix with some major refactoring
|
||||
* Keep one branch for one specific issue. If you need to work on other unrelated issues, create another branch.
|
||||
|
||||
## Review and Merge
|
||||
|
||||
When your branch is ready, send the pull request.
|
||||
|
||||
While it is not always the case, often it is necessary to improve parts of your code in the branch. This is the actual review process.
|
||||
|
||||
Here is a check list for the review:
|
||||
|
||||
* It does not break the test suite
|
||||
* There is no typo
|
||||
* The coding style follows the existing one
|
||||
* There is a reasonable amount of comment
|
||||
* The license header is intact
|
||||
* All examples are still working
|
||||
|
205
ChangeLog
205
ChangeLog
|
@ -1,207 +1,4 @@
|
|||
Please see also http://phantomjs.org/releases.html.
|
||||
|
||||
2015-01-23: Version 2.0.0
|
||||
|
||||
New features
|
||||
|
||||
* Switched to Qt 5 and updated WebKit (issue 10448)
|
||||
* Implemented clearing of memory cache (issue 10357)
|
||||
* Added support for HTTP header change for every request (issue 11299)
|
||||
|
||||
Improvements
|
||||
|
||||
* Fixed rendering of CJK text by always linking the codecs (issue 10249)
|
||||
* Ensured onResourceReceived is still fired on an error (issue 11163)
|
||||
* Fixed possible crash in handling network requests (issue 11252)
|
||||
* Removed hardcoded GhostDriver launching message (issue 12681)
|
||||
* Allowed disk cache more than 2 GB (issue 12303)
|
||||
|
||||
Examples
|
||||
|
||||
* Netsniff example should exit when fails to load (issue 11333)
|
||||
|
||||
2014-01-25: Version 1.9.7
|
||||
|
||||
* Reverted to GhostDriver 1.1.0 instead of 1.1.1 (issue 11915)
|
||||
* Fixed another warning of obsolete userSpaceScaleFactor on OS X 10.9 (issue 11612)
|
||||
|
||||
2014-01-20: Version 1.9.6
|
||||
|
||||
* Updated GhostDriver to version 1.1.1 (issue 11877, 11893)
|
||||
|
||||
2014-01-19: Version 1.9.3
|
||||
|
||||
* Fixed CoreText performance note on OS X 10.9 (issue 11418)
|
||||
* Fixed warning of obsolete userSpaceScaleFactor on OS X 10.9 (issue 11612)
|
||||
|
||||
2013-09-06: Version 1.9.2
|
||||
|
||||
* Fixed graphical artifacts with transparent background on Windows (issue 11276, 11007, 11366)
|
||||
* Updated GhostDriver to version 1.0.4 (issue 11452)
|
||||
|
||||
2013-06-04: Version 1.9.1
|
||||
|
||||
Critical bug fixes:
|
||||
|
||||
* Fixed problems with specifying proxy server (issue 10811, 11117)
|
||||
* Fixed UTF-8 encoding with system.stdout and system.stderr (issue 11162)
|
||||
* Ensured that onResourceReceived will be always invoked (issue 11163)
|
||||
* Fixed module loading from an absolute path on Windows (issue 11165)
|
||||
* Fixed typo in the command-line option for setting the cache size (11219)
|
||||
* Fixed possible crash when handling network requests (issue 11252, 11338)
|
||||
|
||||
2013-03-20: Version 1.9.0 "Sakura"
|
||||
|
||||
New features
|
||||
|
||||
* Added spawn and execFile to execute external programs (issue 10219)
|
||||
* Added the ability to abort network requests (issue 10230)
|
||||
* Added system access to stdin, stdout, and stderr (issue 10333)
|
||||
* Added support for custom CA certificates location (issue 10916)
|
||||
* Added seek function to the File stream (issue 10937)
|
||||
* Implemented file read for a specified number of bytes (issue 10938)
|
||||
* Added a callback to handle network error (issue 10954, 10997)
|
||||
* Added custom encoding support when opening a page (issue 11043)
|
||||
* Implemented require.stub() support for a factory function (issue 11044)
|
||||
* Added page loading indicator and progress (issue 11091)
|
||||
* Added a timeout option for network requests (issue 11129)
|
||||
|
||||
Improvements
|
||||
|
||||
* Fixed the build on FreeBSD (issue 10597)
|
||||
* Ensured a consistent 72 dpi for Linux headless rendering (issue 10659)
|
||||
* Fixed possible PDF error due to invalid CreationDate field (issue 10663)
|
||||
* Fixed crash when uploading non existing files (issue 10941)
|
||||
* Improved the autocomplete internal of the interactive/REPL mode (issue 10943)
|
||||
* Fixed possible crash when accessing inline frames (issue 10947)
|
||||
* Changed Linux binary package setup to be built on CentOS 5 (issue 10963)
|
||||
* Extended SSL ignore setting to synchronous XHR (issue 10985)
|
||||
* Added convenient constants for modifier keys (issue 11056)
|
||||
* Fixed incorrect date handling in the cookies (issue 11068)
|
||||
* Updated GhostDriver to version 1.0.3 (issue 11146)
|
||||
|
||||
Examples
|
||||
|
||||
* Fixed invalid data URI in the netsniff example (issue 10740)
|
||||
* Implemented a new weather example (issue 10794)
|
||||
* Fixed rendering issues in render_multi_url (issue 11021)
|
||||
* Fixed proper event sequence in page_events example (issue 11028)
|
||||
* Miscellanous tweaks (issue 11082)
|
||||
|
||||
2013-03-02: Version 1.8.2
|
||||
|
||||
Critical bug fixes:
|
||||
|
||||
* Fixed possible PDF error due to invalid CreationDate field (issue 663)
|
||||
* Fixed crash when uploading non existing files (issue 941)
|
||||
* Fixed possible crash when accessing inline frames (issue 947)
|
||||
* Extended SSL ignore setting to synchronous XHR (issue 985)
|
||||
* Fixed incorrect date handling in the cookies (issue 1068)
|
||||
|
||||
2013-01-06: Version 1.8.1
|
||||
|
||||
Critical bug fix:
|
||||
|
||||
* Mac OS X: Fix possible crash when using some TrueType fonts (issue 690)
|
||||
|
||||
2012-12-21: Version 1.8.0 "Blue Winter Rose"
|
||||
|
||||
New features
|
||||
|
||||
* Integrated GhostDriver as the WebDriver implementation (issue 49)
|
||||
* Added an option to specify the SSL protocol (issue 174)
|
||||
* Added encoding support for WebServer's response (issue 505)
|
||||
* Added process ID (PID) to the System module (issue 769)
|
||||
* Added properties to obtain page and frame title (issue 799)
|
||||
* Added page navigation methods (issue 808)
|
||||
* Added support for modifier keys in keyboard events (issue 835)
|
||||
* Added onFilePicker callback for more generic file upload API (issue 843)
|
||||
* Added the ability to set the page content and location (issue 909)
|
||||
|
||||
Improvements
|
||||
|
||||
* Fixed date parsing in ISO8601 format (issue 187, 267)
|
||||
* Fixed window.location (issue 530, 632)
|
||||
* Deregistered multiple callback handler (issue 807)
|
||||
* Fixed sending of double-click events (issue 848)
|
||||
* Increases maximum number of redirects (issue 849)
|
||||
* Fixed keycodes sent for lowercase characters (issue 852)
|
||||
* Fixed a regression in table row page break (issue 880)
|
||||
* Completed the CoffeeScript version of the examples (issue 907)
|
||||
* Updated Qt to version 4.8.4 (issue 918)
|
||||
* Fixed potential hang in some example scripts (issue 922)
|
||||
|
||||
2012-09-22: Version 1.7.0 "Blazing Star"
|
||||
|
||||
New features
|
||||
|
||||
* Added a module system modelled after CommonJS/Node.js (issue 47)
|
||||
* Added support for window pop-up (issue 151)
|
||||
* Static build on Linux (issue 413)
|
||||
* Added run-time detection of SSL support (issue 484)
|
||||
* Added more events support (issue 492, 712)
|
||||
* Added support for disabling automatic proxy detection (issue 580)
|
||||
* Provided page closing callback (issue 678)
|
||||
* Added methods to access URL, frames URL, frame Content (issue 758)
|
||||
* Added more cookies-related API (issue 761)
|
||||
|
||||
Improvements
|
||||
|
||||
* Refactored command-line options handling (issue 55)
|
||||
* Improved the workflow for producing release builds (issue 599)
|
||||
* Improved cookies API and implementation (issue 603, 761)
|
||||
* Improved frame switching API (issue 654)
|
||||
* Fixed iframe handling regression (issue 683)
|
||||
* Fixed OS version number with Windows 8 and Mountain Lion (issue 684, 688)
|
||||
* Fixed HAR navigation info in the netsniff example (issue 733)
|
||||
* Fixed compile warnings with Visual Studio (issue 744)
|
||||
* Removed hacks for static linking on Windows (issue 753)
|
||||
* Added ICO image handling on Windows (issue 779)
|
||||
* Fixed font antialiasing on Windows (issue 785)
|
||||
* Improved Jasmine test runner for Jasmine 1.2 (issue 792)
|
||||
|
||||
2012-07-22: Version 1.6.1
|
||||
|
||||
Bug fixes
|
||||
|
||||
* Don't build the deploy in debug mode (issue 599)
|
||||
* Fixed building on Windows (issue 424)
|
||||
* Fixed remote inspector when building statically (issue 430)
|
||||
|
||||
2012-06-20: Version 1.6.0 "Lavender"
|
||||
|
||||
New features
|
||||
|
||||
* Added support for passing arguments to WebPage's evaluate (issue 132)
|
||||
* Added callbacks for JavaScript onConfirm and onPrompt (issue 133)
|
||||
* Added stack trace when error occurs (issue 166)
|
||||
* Added support for local storage path and quota (issue 300)
|
||||
* Added initial support for cookies handling (issue 354)
|
||||
* Added support for header footer when printing the page (issue 410, 512)
|
||||
* Added headers support in the loading request (issue 452)
|
||||
* Added support to render the web page as base64-encoded string (issue 547)
|
||||
* Added hooks for navigation event (issue 562)
|
||||
* Added command-line option to show debug messages (issue 575)
|
||||
* Added support for the zoom factor for web page rendering (issue 579)
|
||||
* Added crash reporter for Mac OS X and Linux, based on Google Breakpad (issue 576)
|
||||
* Added 'os' object to the system module (issue 585)
|
||||
* Added support for asynchronous evaluation (issue 593)
|
||||
|
||||
Improvements
|
||||
|
||||
* Fixed remote debugging to work on Mac OS X and Windows (issue 430)
|
||||
* Fixed web server getting the dropped connection for empty response (issue 451)
|
||||
* Fixed text rendered as boxes (squares) on headless Linux (issue 460)
|
||||
* Updated Qt to version 4.8.2 (issue 495)
|
||||
* Updated CoffeeScript compiler to version 1.3.3 (issue 496)
|
||||
* Fixed the build script to detect and use MAKEFLAGS (issue 503)
|
||||
* Fixed the build script to properly pass Qt config flags (issue 507)
|
||||
* Changed Info.plist to be embedded in Mac OS X executable (issue 528)
|
||||
* Fixed wrong module require in the imagebin example (issue 536)
|
||||
* Fixed example scripts to exit with the right exit code (issue 544)
|
||||
* Fixed build failure with glib 2.31.0+ (issue 559)
|
||||
* Fixed error handler failures in some cases (issue 589)
|
||||
* Fixed Twitter-related examples to work with the new site (issue 609)
|
||||
Please see also http://code.google.com/p/phantomjs/wiki/ReleaseNotes.
|
||||
|
||||
2012-03-20: Version 1.5.0 "Ghost Flower"
|
||||
|
||||
|
|
59
README.md
59
README.md
|
@ -1,46 +1,33 @@
|
|||
# [PhantomJS](http://phantomjs.org) - Scriptable Headless WebKit
|
||||
PhantomJS ([www.phantomjs.org](http://phantomjs.org)) is a headless WebKit with JavaScript API.
|
||||
|
||||
PhantomJS ([www.phantomjs.org](http://phantomjs.org)) is a headless WebKit scriptable with JavaScript. It is used by hundreds of [developers](http://phantomjs.org/buzz.html) and dozens of [organizations](http://phantomjs.org/users.html) for web-related development workflow.
|
||||
It has **fast** and **native** support for DOM handling, CSS selector, JSON, Canvas, and SVG.
|
||||
|
||||
The latest [stable release](http://phantomjs.org/release-2.0.html) is version 2.0.
|
||||
PhantomJS is cross-platform, it can be compiled for Linux, Windows, FreeBSD, and Mac OS X.
|
||||
Refer to the [build instructions](http://code.google.com/p/phantomjs/wiki/BuildInstructions)
|
||||
for details.
|
||||
|
||||
**Note**: Please **do not** create a GitHub pull request **without** reading the [Contribution Guide](https://github.com/ariya/phantomjs/blob/master/CONTRIBUTING.md) first. Failure to do so may result in the rejection of the pull request.
|
||||
**Note**: If you are on Mac OS X, [read the notice](http://code.google.com/p/phantomjs/wiki/BuildInstructions#Mac_OS_X)
|
||||
before you start using `brew` or `port` to install Qt and/or PhantomJS.
|
||||
|
||||
## Use Cases
|
||||
PhantomJS scripts can be written in JavaScript or [CoffeeScript](http://jashkenas.github.com/coffee-script/).
|
||||
|
||||
- **Headless web testing**. Lightning-fast testing without the browser is now possible! Various [test frameworks](http://phantomjs.org/headless-testing.html) such as Jasmine, Capybara, QUnit, Mocha, WebDriver, YUI Test, BusterJS, FuncUnit, Robot Framework, and many others are supported.
|
||||
- **Page automation**. [Access and manipulate](http://phantomjs.org/page-automation.html) web pages with the standard DOM API, or with usual libraries like jQuery.
|
||||
- **Screen capture**. Programmatically [capture web contents](http://phantomjs.org/screen-capture.html), including CSS, SVG and Canvas. Build server-side web graphics apps, from a screenshot service to a vector chart rasterizer.
|
||||
- **Network monitoring**. Automate performance analysis, track [page loading](http://phantomjs.org/network-monitoring.html) and export as standard HAR format.
|
||||
See also [quick start guide](http://code.google.com/p/phantomjs/wiki/QuickStart)
|
||||
and more [advanced examples](http://code.google.com/p/phantomjs/wiki/ServiceIntegration)
|
||||
which show various PhantomJS scripts, covering:
|
||||
|
||||
## Features
|
||||
* getting driving direction
|
||||
* showing weather forecast conditions
|
||||
* finding pizza in New York
|
||||
* looking up approximate location based on IP address
|
||||
* pulling the list of seasonal food
|
||||
* running regression tests from command line
|
||||
* producing PDF version of a Wikipedia article
|
||||
* rasterizing SVG to image
|
||||
|
||||
- **Multiplatform**, available on major operating systems: Windows, Mac OS X, Linux, and other Unices.
|
||||
- **Fast and native implementation** of web standards: DOM, CSS, JavaScript, Canvas, and SVG. No emulation!
|
||||
- **Pure headless (no X11) on Linux**, ideal for continuous integration systems. Also runs on Amazon EC2, Heroku, and Iron.io.
|
||||
- **Easy to install**: [Download](http://phantomjs.org/download.html), unpack, and start having fun in just 5 minutes.
|
||||
Do not forget to consult the concise [API Reference](http://code.google.com/p/phantomjs/wiki/Interface).
|
||||
|
||||
## Ecosystem
|
||||
|
||||
PhantomJS needs not be used only as a stand-alone tool. Check also some excellent related projects:
|
||||
|
||||
- [CasperJS](http://casperjs.org) enables easy navigation scripting and common high-level testing.
|
||||
- [Poltergeist](https://github.com/jonleighton/poltergeist) allows running Capybara tests headlessly.
|
||||
- [Guard::Jasmine](https://github.com/netzpirat/guard-jasmine) automatically tests Jasmine specs on Rails when files are modified.
|
||||
- [GhostDriver](http://github.com/detro/ghostdriver/) complements Selenium tests with a PhantomJS WebDriver implementation.
|
||||
- [PhantomRobot](https://github.com/datakurre/phantomrobot) runs Robot Framework acceptance tests in the background via PhantomJS.
|
||||
- [Mocha-PhantomJS](https://github.com/metaskills/mocha-phantomjs) run Mocha tests using PhantomJS.
|
||||
|
||||
and many others [related projects](http://phantomjs.org/related-projects.html).
|
||||
|
||||
## Questions?
|
||||
|
||||
- Explore the complete [documentation](http://phantomjs.org/documentation/).
|
||||
- Read tons of [user articles](http://phantomjs.org/buzz.html) on using PhantomJS.
|
||||
- Join the [mailing-list](http://groups.google.com/group/phantomjs) and discuss with other PhantomJS fans.
|
||||
|
||||
PhantomJS is free software/open source, and is distributed under the [BSD license](http://opensource.org/licenses/BSD-3-Clause). It contains third-party code, see the included `third-party.txt` file for the license information on third-party code.
|
||||
|
||||
PhantomJS is created and maintained by [Ariya Hidayat](http://ariya.ofilabs.com/about) (Twitter: [@ariyahidayat](http://twitter.com/ariyahidayat)), with the help of [many contributors](https://github.com/ariya/phantomjs/contributors). Follow the official Twitter stream [@PhantomJS](http://twitter.com/PhantomJS) to get the frequent development updates.
|
||||
PhantomJS is based on [Qt](http://qt.nokia.com).
|
||||
|
||||
The latest [stable release](http://code.google.com/p/phantomjs/wiki/ReleaseNotes) is version 1.5 ("Ghost Flower").
|
||||
|
||||
If you want to contribute, please read the [Contribution Guide](http://code.google.com/p/phantomjs/wiki/ContributionGuide).
|
||||
|
|
128
build.cmd
128
build.cmd
|
@ -1,128 +0,0 @@
|
|||
@echo off
|
||||
SETLOCAL EnableExtensions EnableDelayedExpansion
|
||||
|
||||
set BUILD_TYPE=release
|
||||
if /i "%1" == "debug" (
|
||||
SET BUILD_TYPE=debug
|
||||
)
|
||||
set ROOT_DIR=%CD%
|
||||
set 3RD_PARTY_LIBRARIES_REPO_URL=https://github.com/Vitallium/phantomjs-3rdparty-win
|
||||
set 3RD_PARTY_LIBRARIES_REPO_BRANCH=msvc2013
|
||||
|
||||
if /i BUILD_TYPE == "debug" (
|
||||
set 3RD_PARTY_LIBRARIES_REPO_BRANCH=msvc2013_debug
|
||||
)
|
||||
|
||||
set BUILD_DATESTAMP=%date:~-4,4%%date:~-7,2%%date:~-10,2%
|
||||
set BUILD_TIMESTAMP=%time:~-11,2%%time:~-8,2%
|
||||
|
||||
:: replace leading space with 0
|
||||
set BUILD_TIMESTAMP=%BUILD_TIMESTAMP: =0%
|
||||
set QT_LOG_FILE=!ROOT_DIR!\build_qt_!BUILD_DATESTAMP!-!BUILD_TIMESTAMP!.log
|
||||
set WEBKIT_LOG_FILE=!ROOT_DIR!\build_webkit_!BUILD_DATESTAMP!_!BUILD_TIMESTAMP!.log
|
||||
set PHANTOMJS_LOG_FILE=!ROOT_DIR!\build_phantomjs_!BUILD_DATESTAMP!_!BUILD_TIMESTAMP!.log
|
||||
set MAKE_TOOL=nmake
|
||||
|
||||
echo:
|
||||
echo Build type: !BUILD_TYPE!
|
||||
call :build
|
||||
ENDLOCAL
|
||||
|
||||
@exit /B 0
|
||||
|
||||
rem ========================================================================================================
|
||||
:build
|
||||
SETLOCAL EnableExtensions EnableDelayedExpansion
|
||||
set _3RDPARTY=!ROOT_DIR!\src\qt\3rdparty
|
||||
|
||||
for %%X in (git.exe) do (set GIT_FOUND=%%~$PATH:X)
|
||||
if defined GIT_FOUND (
|
||||
echo.
|
||||
echo GIT found. Getting 3rd party libraries.
|
||||
if not exist !_3RDPARTY! call git clone -b !3RD_PARTY_LIBRARIES_REPO_BRANCH! !3RD_PARTY_LIBRARIES_REPO_URL! !_3RDPARTY!
|
||||
) else (
|
||||
ECHO.
|
||||
CALL :exitB "Git is missing! Can't proceed. Please install Git."
|
||||
GOTO :eof
|
||||
)
|
||||
|
||||
:: prepare 3rdparty libraries
|
||||
:: setup INCLUDE and LIB environment variables
|
||||
:: OpenSSL
|
||||
set OPENSSL_DIR=!_3RDPARTY!\openssl
|
||||
set OPENSSL_LIB=!OPENSSL_DIR!\lib
|
||||
set OPENSSL_INCLUDE=!OPENSSL_DIR!\include
|
||||
|
||||
:: ICU
|
||||
set ICU_DIR=!_3RDPARTY!\libicu
|
||||
set ICU_LIB=!ICU_DIR!\lib
|
||||
set ICU_INCLUDE=!ICU_DIR!\include
|
||||
|
||||
:: libxml
|
||||
set LIBXML_DIR=!_3RDPARTY!\libxml
|
||||
set LIBXML_LIB=!LIBXML_DIR!\lib
|
||||
set LIBXML_INCLUDE=!LIBXML_DIR!\include\libxml2
|
||||
|
||||
:: sqlite
|
||||
set SQLITE3SRCDIR=!ROOT_DIR!\src\qt\qtbase\src\3rdparty\sqlite
|
||||
|
||||
set LIB=!OPENSSL_LIB!;!ICU_LIB!;!LIBXML_LIB!;%LIB%
|
||||
set INCLUDE=!OPENSSL_INCLUDE!;!ICU_INCLUDE!;!LIBXML_INCLUDE!;%INCLUDE%
|
||||
set PATH=!_3RDPARTY!\gnuwin32\bin;%PATH%
|
||||
|
||||
echo LIB: %LIB%
|
||||
echo INCLUDE: %INCLUDE%
|
||||
|
||||
for %%X in (jom.exe) do (set JOMFOUND=%%~$PATH:X)
|
||||
if defined JOMFOUND (
|
||||
set MAKE_TOOL=jom
|
||||
) else (
|
||||
set MAKE_TOOL=nmake
|
||||
)
|
||||
|
||||
pushd !ROOT_DIR!\src\qt
|
||||
call preconfig.cmd !BUILD_TYPE! 2>&1 >> !QT_LOG_FILE!
|
||||
popd
|
||||
|
||||
set PATH=!ROOT_DIR!\src\qt\qtbase\bin;%PATH%
|
||||
for %%X in (qmake.exe) do (set QMAKE_FOUND=%%~$PATH:X)
|
||||
if defined QMAKE_FOUND (
|
||||
echo.
|
||||
echo qmake found. Building QtWebkit
|
||||
) else (
|
||||
ECHO.
|
||||
CALL :exitB "qmake.exe is missing! Can't proceed."
|
||||
GOTO :eof
|
||||
)
|
||||
|
||||
pushd !ROOT_DIR!\src\qt\qtwebkit
|
||||
call qmake.exe
|
||||
%MAKE_TOOL% %BUILD_TYPE% 2>&1 >> !WEBKIT_LOG_FILE!
|
||||
popd
|
||||
|
||||
pushd !ROOT_DIR!\src
|
||||
call qmake.exe
|
||||
%MAKE_TOOL% %BUILD_TYPE% 2>&1 >> !PHANTOMJS_LOG_FILE!
|
||||
popd
|
||||
if EXIST !ROOT_DIR!\bin\phantomjs.exe (
|
||||
echo.
|
||||
echo Build has finished
|
||||
echo.
|
||||
) else (
|
||||
echo:
|
||||
echo Unable to find phantomjs.exe. Please, check log files:
|
||||
echo Qt: !QT_LOG_FILE!
|
||||
echo Webkit: !WEBKIT_LOG_FILE!
|
||||
echo PhantomJS: !PHANTOMJS_LOG_FILE!
|
||||
echo:
|
||||
)
|
||||
EXIT /b
|
||||
|
||||
rem ========================================================================================================
|
||||
:: %1 an error message
|
||||
:exitB
|
||||
echo:
|
||||
echo Error: %1
|
||||
echo:
|
||||
echo Contact vitaliy.slobodin@gmail.com
|
||||
@exit /B 0
|
79
build.sh
79
build.sh
|
@ -1,82 +1,33 @@
|
|||
#!/usr/bin/env bash
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
COMPILE_JOBS=4
|
||||
|
||||
COMPILE_JOBS=1
|
||||
MAKEFLAGS_JOBS=''
|
||||
QT_CFG=''
|
||||
|
||||
if [[ "$MAKEFLAGS" != "" ]]; then
|
||||
MAKEFLAGS_JOBS=$(echo $MAKEFLAGS | egrep -o '\-j[0-9]+' | egrep -o '[0-9]+')
|
||||
fi
|
||||
|
||||
if [[ "$MAKEFLAGS_JOBS" != "" ]]; then
|
||||
# user defined number of jobs in MAKEFLAGS, re-use that number
|
||||
COMPILE_JOBS=$MAKEFLAGS_JOBS
|
||||
elif [[ $OSTYPE = darwin* ]]; then
|
||||
# We only support modern Mac machines, they are at least using
|
||||
# hyperthreaded dual-core CPU.
|
||||
COMPILE_JOBS=4
|
||||
elif [[ $OSTYPE == freebsd* ]]; then
|
||||
COMPILE_JOBS=`sysctl -n hw.ncpu`
|
||||
else
|
||||
CPU_CORES=`grep -c ^processor /proc/cpuinfo`
|
||||
if [[ "$CPU_CORES" -gt 1 ]]; then
|
||||
COMPILE_JOBS=$CPU_CORES
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$COMPILE_JOBS" -gt 8 ]]; then
|
||||
# Safety net.
|
||||
COMPILE_JOBS=8
|
||||
fi
|
||||
|
||||
SILENT=
|
||||
|
||||
until [[ -z "$1" ]]; do
|
||||
until [ -z "$1" ]; do
|
||||
case $1 in
|
||||
(--qmake-args)
|
||||
"--qt-config")
|
||||
shift
|
||||
QMAKE_ARGS=$1
|
||||
QT_CFG+=" $1"
|
||||
shift;;
|
||||
(--jobs)
|
||||
"--jobs")
|
||||
shift
|
||||
COMPILE_JOBS=$1
|
||||
shift;;
|
||||
(--silent)
|
||||
SILENT=silent
|
||||
shift;;
|
||||
|
||||
"--help")
|
||||
cat <<EOF
|
||||
Usage: $0 [--jobs NUM]
|
||||
|
||||
--silent Produce less verbose output.
|
||||
--jobs NUM How many parallel compile jobs to use.
|
||||
Defaults to the number of CPU cores you have,
|
||||
with a maximum of 8.
|
||||
EOF
|
||||
echo "Usage: $0 [--qt-config CONFIG] [--jobs NUM]"
|
||||
echo
|
||||
echo " --qt-config CONFIG Specify extra config options to be used when configuring Qt"
|
||||
echo " --jobs NUM How many parallel compile jobs to use. Defaults to 4."
|
||||
echo
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unrecognised option: $1" >&2
|
||||
echo "Unrecognised option: $1"
|
||||
exit 1;;
|
||||
esac
|
||||
done
|
||||
|
||||
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
|
||||
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
|
||||
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
|
||||
|
||||
echo "System architecture... ($UNAME_SYSTEM $UNAME_RELEASE $UNAME_MACHINE)"
|
||||
|
||||
export QMAKE=qmake
|
||||
# some Linux distros (e.g. Debian) allow you to parallel-install
|
||||
# Qt4 and Qt5, using this environment variable to declare which
|
||||
# one you want
|
||||
export QT_SELECT=qt5
|
||||
|
||||
echo
|
||||
echo "Building main PhantomJS application..."
|
||||
echo
|
||||
$QMAKE $QMAKE_ARGS
|
||||
cd src/qt && ./preconfig.sh --jobs $COMPILE_JOBS && cd ../..
|
||||
src/qt/bin/qmake
|
||||
make -j$COMPILE_JOBS
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
.vagrant
|
||||
/brandelf
|
|
@ -1,60 +0,0 @@
|
|||
Packaging PhantomJS
|
||||
===================
|
||||
|
||||
This directory contains various scripts to assist with making PhantomJS
|
||||
packages.
|
||||
|
||||
Packaging for Linux
|
||||
-------------------
|
||||
|
||||
Linux building/packaging is best done in a virtual machine to ensure
|
||||
isolation and clean state. This is also necessary to build for different
|
||||
architectures.
|
||||
|
||||
We use [Vagrant](http://vagrantup.com/) to help with this. Please see
|
||||
the [Vagrant
|
||||
documentation](http://vagrantup.com/v1/docs/getting-started/index.html)
|
||||
for instructions on how to install VirtualBox and Vagrant.
|
||||
|
||||
Once you have Vagrant installed, building should be as simple as
|
||||
running:
|
||||
|
||||
$ export PHANTOMJS_VERSION=1.6.0 # change as necessary
|
||||
$ vagrant up $ARCH
|
||||
|
||||
Where $ARCH is either `i686` or `x86_64`.
|
||||
|
||||
This runs the `provision_vm.sh` script, which installs the necessary
|
||||
dependencies, checks out a fresh copy of the PhantomJS repository,
|
||||
switches to the relevant tag, builds and packages the software and the
|
||||
associated debugging symbols tarball, and copies the tarballs out of the
|
||||
VM onto your host machine.
|
||||
|
||||
If it runs successfully, you will see the tarballs in this directory,
|
||||
ready for upload.
|
||||
|
||||
If there are any problems, you can re-run the script with:
|
||||
|
||||
$ vagrant provision $ARCH
|
||||
|
||||
Or SSH into the VM:
|
||||
|
||||
$ vagrant ssh $ARCH
|
||||
|
||||
Once you're done, you can destroy the VM with:
|
||||
|
||||
$ vagrant destroy $ARCH
|
||||
|
||||
If you need to build a new version, you should destroy the VM and start
|
||||
again to ensure a clean state. (Or SSH in and do a git clean.)
|
||||
|
||||
Packaging for OS X
|
||||
------------------
|
||||
|
||||
Run `deploy/build-and-package.sh`. That's it.
|
||||
|
||||
However, if you have previously built the sources in release mode, you
|
||||
should clean your tree to make sure all the debugging symbols gets
|
||||
compiled:
|
||||
|
||||
$ make clean && cd src/qt && make clean && cd ../..
|
|
@ -1,42 +0,0 @@
|
|||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
|
||||
unless ENV['PHANTOMJS_VERSION']
|
||||
STDERR.puts 'Please specify PhantomJS version in the PHANTOMJS_VERSION environment variable.'
|
||||
STDERR.puts '(This can be any git ref, e.g. "1.5.0", "master", "origin/1.5", etc.)'
|
||||
exit 1
|
||||
end
|
||||
|
||||
Vagrant::Config.run do |config|
|
||||
config.vm.define :i686 do |c|
|
||||
c.vm.box_url = "https://opscode-vm.s3.amazonaws.com/vagrant/boxes/opscode-centos-5.8-i386.box"
|
||||
c.vm.box = "centos_58_32bit"
|
||||
c.vm.customize ["modifyvm", :id, "--ostype", "RedHat"]
|
||||
end
|
||||
|
||||
config.vm.define :x86_64 do |c|
|
||||
c.vm.box_url = "https://opscode-vm.s3.amazonaws.com/vagrant/boxes/opscode-centos-5.8.box"
|
||||
c.vm.box = "centos_58_64bit"
|
||||
c.vm.customize ["modifyvm", :id, "--ostype", "RedHat_64"]
|
||||
end
|
||||
|
||||
config.vm.define :lucid32 do |c|
|
||||
c.vm.box_url = "http://files.vagrantup.com/lucid32.box"
|
||||
c.vm.box = "lucid32"
|
||||
end
|
||||
|
||||
config.vm.define :lucid64 do |c|
|
||||
c.vm.box_url = "http://files.vagrantup.com/lucid64.box"
|
||||
c.vm.box = "lucid64"
|
||||
end
|
||||
|
||||
config.vm.provision :shell do |s|
|
||||
s.path = "provision-vm.sh"
|
||||
s.args = ENV['PHANTOMJS_VERSION']
|
||||
end
|
||||
|
||||
# You may wish to tweak these, but be aware that you need quite a lot of
|
||||
# memory for the linking stage.
|
||||
config.vm.customize ["modifyvm", :id, "--memory", 3072]
|
||||
config.vm.customize ["modifyvm", :id, "--cpus", 2]
|
||||
end
|
|
@ -1,213 +0,0 @@
|
|||
/*-
|
||||
* Copyright (c) 2000, 2001 David O'Brien
|
||||
* Copyright (c) 1996 Søren Schmidt
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer
|
||||
* in this position and unchanged.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
//NOTE: commented out to make it compile on linux
|
||||
// __FBSDID("$FreeBSD: src/usr.bin/brandelf/brandelf.c,v 1.25.22.2 2012/03/16 03:22:37 eadler Exp $");
|
||||
|
||||
#include <sys/types.h>
|
||||
//NOTE: changed path to make it compile on linux
|
||||
#include <elf.h>
|
||||
#include <sys/errno.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static int elftype(const char *);
|
||||
static const char *iselftype(int);
|
||||
static void printelftypes(void);
|
||||
static void usage(void);
|
||||
|
||||
struct ELFtypes {
|
||||
const char *str;
|
||||
int value;
|
||||
};
|
||||
/* XXX - any more types? */
|
||||
static struct ELFtypes elftypes[] = {
|
||||
{ "FreeBSD", ELFOSABI_FREEBSD },
|
||||
{ "Linux", ELFOSABI_LINUX },
|
||||
{ "Solaris", ELFOSABI_SOLARIS },
|
||||
{ "SVR4", ELFOSABI_SYSV }
|
||||
};
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
|
||||
const char *strtype = "FreeBSD";
|
||||
int type = ELFOSABI_FREEBSD;
|
||||
int retval = 0;
|
||||
int ch, change = 0, force = 0, listed = 0;
|
||||
|
||||
while ((ch = getopt(argc, argv, "f:lt:v")) != -1)
|
||||
switch (ch) {
|
||||
case 'f':
|
||||
if (change)
|
||||
errx(1, "f option incompatible with t option");
|
||||
force = 1;
|
||||
type = atoi(optarg);
|
||||
if (errno == ERANGE || type < 0 || type > 255) {
|
||||
warnx("invalid argument to option f: %s",
|
||||
optarg);
|
||||
usage();
|
||||
}
|
||||
break;
|
||||
case 'l':
|
||||
printelftypes();
|
||||
listed = 1;
|
||||
break;
|
||||
case 'v':
|
||||
/* does nothing */
|
||||
break;
|
||||
case 't':
|
||||
if (force)
|
||||
errx(1, "t option incompatible with f option");
|
||||
change = 1;
|
||||
strtype = optarg;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
if (!argc) {
|
||||
if (listed)
|
||||
exit(0);
|
||||
else {
|
||||
warnx("no file(s) specified");
|
||||
usage();
|
||||
}
|
||||
}
|
||||
|
||||
if (!force && (type = elftype(strtype)) == -1) {
|
||||
warnx("invalid ELF type '%s'", strtype);
|
||||
printelftypes();
|
||||
usage();
|
||||
}
|
||||
|
||||
while (argc) {
|
||||
int fd;
|
||||
char buffer[EI_NIDENT];
|
||||
|
||||
if ((fd = open(argv[0], change || force ? O_RDWR : O_RDONLY, 0)) < 0) {
|
||||
warn("error opening file %s", argv[0]);
|
||||
retval = 1;
|
||||
goto fail;
|
||||
}
|
||||
if (read(fd, buffer, EI_NIDENT) < EI_NIDENT) {
|
||||
warnx("file '%s' too short", argv[0]);
|
||||
retval = 1;
|
||||
goto fail;
|
||||
}
|
||||
if (buffer[0] != ELFMAG0 || buffer[1] != ELFMAG1 ||
|
||||
buffer[2] != ELFMAG2 || buffer[3] != ELFMAG3) {
|
||||
warnx("file '%s' is not ELF format", argv[0]);
|
||||
retval = 1;
|
||||
goto fail;
|
||||
}
|
||||
if (!change && !force) {
|
||||
fprintf(stdout,
|
||||
"File '%s' is of brand '%s' (%u).\n",
|
||||
argv[0], iselftype(buffer[EI_OSABI]),
|
||||
buffer[EI_OSABI]);
|
||||
if (!iselftype(type)) {
|
||||
warnx("ELF ABI Brand '%u' is unknown",
|
||||
type);
|
||||
printelftypes();
|
||||
}
|
||||
}
|
||||
else {
|
||||
buffer[EI_OSABI] = type;
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
if (write(fd, buffer, EI_NIDENT) != EI_NIDENT) {
|
||||
warn("error writing %s %d", argv[0], fd);
|
||||
retval = 1;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
fail:
|
||||
close(fd);
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
usage(void)
|
||||
{
|
||||
(void)fprintf(stderr,
|
||||
"usage: brandelf [-lv] [-f ELF_ABI_number] [-t string] file ...\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static const char *
|
||||
iselftype(int etype)
|
||||
{
|
||||
size_t elfwalk;
|
||||
|
||||
for (elfwalk = 0;
|
||||
elfwalk < sizeof(elftypes)/sizeof(elftypes[0]);
|
||||
elfwalk++)
|
||||
if (etype == elftypes[elfwalk].value)
|
||||
return elftypes[elfwalk].str;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
elftype(const char *elfstrtype)
|
||||
{
|
||||
size_t elfwalk;
|
||||
|
||||
for (elfwalk = 0;
|
||||
elfwalk < sizeof(elftypes)/sizeof(elftypes[0]);
|
||||
elfwalk++)
|
||||
if (strcasecmp(elfstrtype, elftypes[elfwalk].str) == 0)
|
||||
return elftypes[elfwalk].value;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void
|
||||
printelftypes(void)
|
||||
{
|
||||
size_t elfwalk;
|
||||
|
||||
fprintf(stderr, "known ELF types are: ");
|
||||
for (elfwalk = 0;
|
||||
elfwalk < sizeof(elftypes)/sizeof(elftypes[0]);
|
||||
elfwalk++)
|
||||
fprintf(stderr, "%s(%u) ", elftypes[elfwalk].str,
|
||||
elftypes[elfwalk].value);
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
|
@ -1,69 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
cd `dirname $0`/..
|
||||
|
||||
echo "Building Qt and PhantomJS with debugging symbols. If you have previously" \
|
||||
"built without debugging symbols, you should run:"
|
||||
echo
|
||||
echo " $ git clean -xdff"
|
||||
echo
|
||||
|
||||
# This incantation will cause Qt and WebKit and PhantomJS to all build in "release"
|
||||
# mode, with compiler optimisations, but also with debug symbols. (We will strip the
|
||||
# symbols in package.sh.)
|
||||
CFLAGS=-g CXXFLAGS=-g ./build.sh --confirm --qt-config '-webkit-debug' --qmake-args "QMAKE_CFLAGS=-g QMAKE_CXXFLAGS=-g" || exit 1
|
||||
|
||||
# Package the release tarball
|
||||
rm deploy/*.tar.bz2 2>/dev/null
|
||||
./deploy/package.sh || exit 1
|
||||
|
||||
# Build the dump_syms program for dumping breakpad debugging symbols
|
||||
if [[ $OSTYPE = darwin* ]]; then
|
||||
pushd tools
|
||||
../src/qt/bin/qmake dump-syms-mac.pro && make
|
||||
popd
|
||||
else
|
||||
pushd src/breakpad
|
||||
./configure && make || exit 1
|
||||
popd
|
||||
fi
|
||||
|
||||
# Dump and package the breakpad debugging symbols...
|
||||
|
||||
./tools/dump-symbols.sh
|
||||
|
||||
version=$(bin/phantomjs --version | sed 's/ /-/' | sed 's/[()]//g')
|
||||
if [[ $OSTYPE = darwin* ]]; then
|
||||
symbols="phantomjs-$version-macosx-symbols"
|
||||
else
|
||||
symbols="phantomjs-$version-linux-$(uname -m)-symbols"
|
||||
fi
|
||||
|
||||
cp -r symbols/ $symbols
|
||||
|
||||
# The minidump_stackwalk program is architecture-specific, so copy the
|
||||
# binary for later use. This means that e.g. a developer on x86_64 can
|
||||
# analyse a crash dump produced by a i686 user.
|
||||
#
|
||||
# We don't yet have a process for building minidump_stackwalk on OS X
|
||||
if [[ $OSTYPE != darwin* ]]; then
|
||||
cp src/breakpad/src/processor/minidump_stackwalk $symbols
|
||||
|
||||
read -r -d '' README <<EOT
|
||||
These are symbols files that can be used to analyse a crash dump
|
||||
produced by the corresponding binary. To generate a crash report,
|
||||
run:
|
||||
|
||||
./minidump_stackwalk /path/to/crash.dmp .
|
||||
EOT
|
||||
|
||||
echo "$README" > $symbols/README
|
||||
fi
|
||||
|
||||
tar -cjf deploy/$symbols.tar.bz2 $symbols
|
||||
rm -r $symbols
|
||||
|
||||
echo "PhantomJS built and packaged:"
|
||||
echo
|
||||
cd deploy
|
||||
ls -1 *.tar.bz2
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
|
||||
cd `dirname $0`/..
|
||||
|
||||
mkdir phantomjs
|
||||
cp -r examples ChangeLog LICENSE.BSD README.md bin phantomjs
|
||||
|
||||
QT_LIB=src/qt/lib
|
||||
mkdir phantomjs/lib
|
||||
cp -r $QT_LIB/libQtCore.* $QT_LIB/libQtGui.* $QT_LIB/libQtNetwork.* $QT_LIB/libQtWebKit.* phantomjs/lib
|
||||
|
||||
chrpath -r \$ORIGIN/../lib phantomjs/bin/phantomjs
|
||||
tar -czf phantomjs.tar.gz phantomjs
|
||||
rm -r phantomjs/
|
|
@ -1,120 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
#
|
||||
# usage: just run this script (after having run build.sh)
|
||||
# and deploy the created tarball to your target machine.
|
||||
#
|
||||
# It creates a phantomjs-$version folder and copies the binary,
|
||||
# example, license etc. together with all shared library dependencies
|
||||
# to that folder. Furthermore brandelf is used to make the lib
|
||||
# and binary compatible with older unix/linux machines that don't
|
||||
# know the new Linux ELF ABI.
|
||||
#
|
||||
|
||||
cd $(dirname $0)
|
||||
|
||||
if [[ ! -f ../bin/phantomjs ]]; then
|
||||
echo "phantomjs was not built yet, please run build.sh first"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "$1" = "--bundle-libs" ]]; then
|
||||
bundle_libs=1
|
||||
else
|
||||
bundle_libs=0
|
||||
fi
|
||||
|
||||
version=$(../bin/phantomjs --version | sed 's/ /-/' | sed 's/[()]//g')
|
||||
src=..
|
||||
|
||||
echo "packaging phantomjs $version"
|
||||
|
||||
if [[ $OSTYPE = darwin* ]]; then
|
||||
dest="phantomjs-$version-macosx"
|
||||
else
|
||||
dest="phantomjs-$version-linux-$(uname -m)"
|
||||
fi
|
||||
|
||||
rm -Rf $dest{.tar.bz2,} &> /dev/null
|
||||
mkdir -p $dest/bin
|
||||
|
||||
echo
|
||||
|
||||
echo -n "copying files..."
|
||||
cp $src/bin/phantomjs $dest/bin
|
||||
cp -r $src/{ChangeLog,examples,LICENSE.BSD,third-party.txt,README.md} $dest/
|
||||
echo "done"
|
||||
echo
|
||||
|
||||
phantomjs=$dest/bin/phantomjs
|
||||
|
||||
if [[ "$bundle_libs" = "1" ]]; then
|
||||
mkdir -p $dest/lib
|
||||
|
||||
if [[ ! -f brandelf ]]; then
|
||||
echo
|
||||
echo "brandelf executable not found in current dir"
|
||||
echo -n "compiling it now..."
|
||||
g++ brandelf.c -o brandelf || exit 1
|
||||
echo "done"
|
||||
fi
|
||||
|
||||
libs=$(ldd $phantomjs | egrep -o "/[^ ]+ ")
|
||||
|
||||
echo -n "copying shared libs..."
|
||||
libld=
|
||||
for l in $libs; do
|
||||
ll=$(basename $l)
|
||||
cp $l $dest/lib/$ll
|
||||
|
||||
if [[ "$bundle_libs" = "1" ]]; then
|
||||
# ensure OS ABI compatibility
|
||||
./brandelf -t SVR4 $dest/lib/$ll
|
||||
if [[ "$l" == *"ld-linux"* ]]; then
|
||||
libld=$ll
|
||||
fi
|
||||
fi
|
||||
done
|
||||
echo "done"
|
||||
echo
|
||||
|
||||
echo -n "writing run script..."
|
||||
mv $phantomjs $phantomjs.bin
|
||||
phantomjs=$phantomjs.bin
|
||||
run=$dest/bin/phantomjs
|
||||
echo '#!/bin/sh' >> $run
|
||||
echo 'path=$(dirname $(dirname $(readlink -f $0)))' >> $run
|
||||
echo 'export LD_LIBRARY_PATH=$path/lib' >> $run
|
||||
echo 'exec $path/lib/'$libld' $phantomjs $@' >> $run
|
||||
chmod +x $run
|
||||
echo "done"
|
||||
echo
|
||||
fi
|
||||
|
||||
echo -n "stripping binary and libs..."
|
||||
if [[ $OSTYPE = darwin* ]]; then
|
||||
strip -x $phantomjs
|
||||
else
|
||||
strip -s $phantomjs
|
||||
[[ -d $dest/lib ]] && strip -s $dest/lib/*
|
||||
fi
|
||||
echo "done"
|
||||
echo
|
||||
|
||||
echo -n "compressing binary..."
|
||||
if type upx >/dev/null 2>&1; then
|
||||
upx -qqq -9 $phantomjs
|
||||
echo "done"
|
||||
else
|
||||
echo "upx not found"
|
||||
fi
|
||||
echo
|
||||
|
||||
echo -n "creating archive..."
|
||||
if [[ $OSTYPE = darwin* ]]; then
|
||||
zip -r $dest.zip $dest
|
||||
else
|
||||
tar -cjf $dest{.tar.bz2,}
|
||||
fi
|
||||
echo "done"
|
||||
echo
|
|
@ -1,42 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
export PATH=$HOME/git/bin:$PATH
|
||||
|
||||
if type apt-get >/dev/null 2>&1; then
|
||||
apt-get update
|
||||
apt-get install -y build-essential git-core libssl-dev libfontconfig1-dev gdb binutils-gold
|
||||
fi
|
||||
|
||||
if type yum >/dev/null 2>&1; then
|
||||
yum -y update
|
||||
yum -y install gcc gcc-c++ make openssl-devel freetype-devel fontconfig-devel
|
||||
if type git >/dev/null 2>&1; then
|
||||
echo "Git is already available."
|
||||
else
|
||||
yum -y install cpio expat-devel gettext-devel zlib-devel
|
||||
echo "Downloading and building git..."
|
||||
rm -rf git-*
|
||||
wget -nv https://git-core.googlecode.com/files/git-1.8.0.3.tar.gz
|
||||
tar -xzvf git-1.8.0.3.tar.gz
|
||||
cd git-1.8.0.3
|
||||
./configure --prefix=$HOME/git && make -j2 && make install
|
||||
cd ..
|
||||
sleep 3
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ ! -d phantomjs ]]; then
|
||||
git clone git://github.com/ariya/phantomjs.git
|
||||
fi
|
||||
|
||||
cd phantomjs
|
||||
git fetch origin
|
||||
git reset --hard
|
||||
git checkout $1
|
||||
|
||||
cp /vagrant/build-and-package.sh deploy/
|
||||
cp /vagrant/package.sh deploy/
|
||||
|
||||
deploy/build-and-package.sh
|
||||
|
||||
cp deploy/*.tar.bz2 /vagrant
|
|
@ -0,0 +1,7 @@
|
|||
system = require 'system'
|
||||
if system.args.length is 1
|
||||
console.log 'Try to pass some args when invoking this script!'
|
||||
else
|
||||
for arg, i in system.args
|
||||
console.log i + ': ' + arg
|
||||
phantom.exit()
|
|
@ -1,27 +0,0 @@
|
|||
var spawn = require("child_process").spawn
|
||||
var execFile = require("child_process").execFile
|
||||
|
||||
var child = spawn("ls", ["-lF", "/rooot"])
|
||||
|
||||
child.stdout.on("data", function (data) {
|
||||
console.log("spawnSTDOUT:", JSON.stringify(data))
|
||||
})
|
||||
|
||||
child.stderr.on("data", function (data) {
|
||||
console.log("spawnSTDERR:", JSON.stringify(data))
|
||||
})
|
||||
|
||||
child.on("exit", function (code) {
|
||||
console.log("spawnEXIT:", code)
|
||||
})
|
||||
|
||||
//child.kill("SIGKILL")
|
||||
|
||||
execFile("ls", ["-lF", "/usr"], null, function (err, stdout, stderr) {
|
||||
console.log("execFileSTDOUT:", JSON.stringify(stdout))
|
||||
console.log("execFileSTDERR:", JSON.stringify(stderr))
|
||||
})
|
||||
|
||||
setTimeout(function () {
|
||||
phantom.exit(0)
|
||||
}, 2000)
|
|
@ -0,0 +1,46 @@
|
|||
page = require('webpage').create()
|
||||
|
||||
page.viewportSize = { width: 400, height : 400 }
|
||||
page.content = '<html><body><canvas id="surface"></canvas></body></html>'
|
||||
|
||||
page.evaluate ->
|
||||
el = document.getElementById 'surface'
|
||||
context = el.getContext '2d'
|
||||
width = window.innerWidth
|
||||
height = window.innerHeight
|
||||
cx = width / 2
|
||||
cy = height / 2
|
||||
radius = width / 2.3
|
||||
i = 0
|
||||
|
||||
el.width = width
|
||||
el.height = height
|
||||
imageData = context.createImageData(width, height)
|
||||
pixels = imageData.data
|
||||
|
||||
for y in [0...height]
|
||||
for x in [0...width]
|
||||
i = i + 4
|
||||
rx = x - cx
|
||||
ry = y - cy
|
||||
d = rx * rx + ry * ry
|
||||
if d < radius * radius
|
||||
hue = 6 * (Math.atan2(ry, rx) + Math.PI) / (2 * Math.PI)
|
||||
sat = Math.sqrt(d) / radius
|
||||
g = Math.floor(hue)
|
||||
f = hue - g
|
||||
u = 255 * (1 - sat)
|
||||
v = 255 * (1 - sat * f)
|
||||
w = 255 * (1 - sat * (1 - f))
|
||||
pixels[i] = [255, v, u, u, w, 255, 255][g]
|
||||
pixels[i + 1] = [w, 255, 255, v, u, u, w][g]
|
||||
pixels[i + 2] = [u, u, w, 255, 255, v, u][g]
|
||||
pixels[i + 3] = 255
|
||||
|
||||
context.putImageData imageData, 0, 0
|
||||
document.body.style.backgroundColor = 'white'
|
||||
document.body.style.margin = '0px'
|
||||
|
||||
page.render('colorwheel.png')
|
||||
|
||||
phantom.exit()
|
|
@ -0,0 +1,8 @@
|
|||
t = 10
|
||||
interval = setInterval ->
|
||||
if t > 0
|
||||
console.log t--
|
||||
else
|
||||
console.log 'BLAST OFF!'
|
||||
phantom.exit()
|
||||
, 1000
|
|
@ -0,0 +1,41 @@
|
|||
page = require('webpage').create()
|
||||
system = require 'system'
|
||||
|
||||
page.onInitialized = ->
|
||||
page.evaluate ->
|
||||
userAgent = window.navigator.userAgent
|
||||
platform = window.navigator.platform
|
||||
window.navigator =
|
||||
appCodeName: 'Mozilla'
|
||||
appName: 'Netscape'
|
||||
cookieEnabled: false
|
||||
sniffed: false
|
||||
|
||||
window.navigator.__defineGetter__ 'userAgent', ->
|
||||
window.navigator.sniffed = true
|
||||
userAgent
|
||||
|
||||
window.navigator.__defineGetter__ 'platform', ->
|
||||
window.navigator.sniffed = true
|
||||
platform
|
||||
|
||||
if system.args.length is 1
|
||||
console.log 'Usage: unsniff.coffee <some URL>'
|
||||
phantom.exit()
|
||||
else
|
||||
address = system.args[1]
|
||||
console.log 'Checking ' + address + '...'
|
||||
page.open address, (status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'FAIL to load the address'
|
||||
else
|
||||
window.setTimeout ->
|
||||
sniffed = page.evaluate(->
|
||||
navigator.sniffed
|
||||
)
|
||||
if sniffed
|
||||
console.log 'The page tried to sniff the user agent.'
|
||||
else
|
||||
console.log 'The page did not try to sniff the user agent.'
|
||||
phantom.exit()
|
||||
, 1500
|
|
@ -33,15 +33,14 @@ page.onInitialized = function () {
|
|||
};
|
||||
|
||||
if (system.args.length === 1) {
|
||||
console.log('Usage: detectsniff.js <some URL>');
|
||||
phantom.exit(1);
|
||||
console.log('Usage: unsniff.js <some URL>');
|
||||
phantom.exit();
|
||||
} else {
|
||||
address = system.args[1];
|
||||
console.log('Checking ' + address + '...');
|
||||
page.open(address, function (status) {
|
||||
if (status !== 'success') {
|
||||
console.log('FAIL to load the address');
|
||||
phantom.exit();
|
||||
} else {
|
||||
window.setTimeout(function () {
|
||||
sniffed = page.evaluate(function () {
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
# Get driving direction using Google Directions API.
|
||||
|
||||
page = require('webpage').create()
|
||||
system = require 'system'
|
||||
|
||||
if system.args.length < 3
|
||||
console.log 'Usage: direction.coffee origin destination'
|
||||
console.log 'Example: direction.coffee "San Diego" "Palo Alto"'
|
||||
phantom.exit(1)
|
||||
else
|
||||
origin = system.args[1]
|
||||
dest = system.args[2]
|
||||
page.open encodeURI('http://maps.googleapis.com/maps/api/directions/xml?origin=' + origin +
|
||||
'&destination=' + dest + '&units=imperial&mode=driving&sensor=false'),
|
||||
(status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to access network'
|
||||
else
|
||||
steps = page.content.match(/<html_instructions>(.*)<\/html_instructions>/ig)
|
||||
if not steps
|
||||
console.log 'No data available for ' + origin + ' to ' + dest
|
||||
else
|
||||
for ins in steps
|
||||
ins = ins.replace(/\</ig, '<').replace(/\>/ig, '>')
|
||||
ins = ins.replace(/\<div/ig, '\n<div')
|
||||
ins = ins.replace(/<.*?>/g, '')
|
||||
console.log(ins)
|
||||
console.log ''
|
||||
console.log page.content.match(/<copyrights>.*<\/copyrights>/ig).join('').replace(/<.*?>/g, '')
|
||||
phantom.exit()
|
|
@ -0,0 +1,20 @@
|
|||
# echoToFile.coffee - Write in a given file all the parameters passed on the CLI
|
||||
fs = require 'fs'
|
||||
system = require 'system'
|
||||
|
||||
if system.args.length < 3
|
||||
console.log "Usage: echoToFile.coffee DESTINATION_FILE <arguments to echo...>"
|
||||
phantom.exit()
|
||||
else
|
||||
content = ""
|
||||
f = null
|
||||
i = 2
|
||||
while i < system.args.length
|
||||
content += system.args[i] + (if i == system.args.length - 1 then "" else " ")
|
||||
++i
|
||||
try
|
||||
f = fs.open(system.args[1], "w")
|
||||
f.writeLine content
|
||||
catch e
|
||||
console.log e
|
||||
phantom.exit()
|
|
@ -4,18 +4,19 @@ var fs = require('fs'),
|
|||
|
||||
if (system.args.length < 3) {
|
||||
console.log("Usage: echoToFile.js DESTINATION_FILE <arguments to echo...>");
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
} else {
|
||||
var content = '',
|
||||
f = null,
|
||||
i;
|
||||
f = null;
|
||||
for ( i= 2; i < system.args.length; ++i ) {
|
||||
content += system.args[i] + (i === system.args.length-1 ? '' : ' ');
|
||||
}
|
||||
|
||||
try {
|
||||
fs.write(system.args[1], content, 'w');
|
||||
} catch(e) {
|
||||
f = fs.open(system.args[1], "w");
|
||||
f.writeLine(content);
|
||||
f.close();
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
fibs = [0, 1]
|
||||
f = ->
|
||||
console.log fibs[fibs.length - 1]
|
||||
fibs.push fibs[fibs.length - 1] + fibs[fibs.length - 2]
|
||||
if fibs.length > 10
|
||||
window.clearInterval ticker
|
||||
phantom.exit()
|
||||
ticker = window.setInterval(f, 300)
|
|
@ -0,0 +1,29 @@
|
|||
# List following and followers from several accounts
|
||||
|
||||
users= [
|
||||
'ariyahidayat'
|
||||
'detronizator'
|
||||
'KDABQt'
|
||||
'lfranchi'
|
||||
'jonleighton'
|
||||
]
|
||||
|
||||
follow = (user, callback) ->
|
||||
page = require('webpage').create()
|
||||
page.open 'http://mobile.twitter.com/' + user, (status) ->
|
||||
if status is 'fail'
|
||||
console.log user + ': ?'
|
||||
else
|
||||
data = page.evaluate -> document.querySelector('div.timeline-following').innerText
|
||||
console.log user + ': ' + data
|
||||
callback.apply()
|
||||
|
||||
process = () ->
|
||||
if (users.length > 0)
|
||||
user = users[0]
|
||||
users.splice(0, 1)
|
||||
follow(user, process)
|
||||
else
|
||||
phantom.exit()
|
||||
|
||||
process()
|
|
@ -1,13 +1,10 @@
|
|||
// List following and followers from several accounts
|
||||
|
||||
var users = ['PhantomJS',
|
||||
'ariyahidayat',
|
||||
var users = ['ariyahidayat',
|
||||
'detronizator',
|
||||
'KDABQt',
|
||||
'lfranchi',
|
||||
'jonleighton',
|
||||
'_jamesmgreene',
|
||||
'Vitalliumm'];
|
||||
'jonleighton'];
|
||||
|
||||
function follow(user, callback) {
|
||||
var page = require('webpage').create();
|
||||
|
@ -16,11 +13,10 @@ function follow(user, callback) {
|
|||
console.log(user + ': ?');
|
||||
} else {
|
||||
var data = page.evaluate(function () {
|
||||
return document.querySelector('div.profile td.stat.stat-last div.statnum').innerText;
|
||||
return document.querySelector('div.timeline-following').innerText;
|
||||
});
|
||||
console.log(user + ': ' + data);
|
||||
}
|
||||
page.close();
|
||||
callback.apply();
|
||||
});
|
||||
}
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
console.log 'Hello, world!'
|
||||
phantom.exit()
|
|
@ -0,0 +1,20 @@
|
|||
# Upload an image to imagebin.org
|
||||
|
||||
page = require('webpage').create()
|
||||
system = require 'system'
|
||||
|
||||
if system.args.length isnt 2
|
||||
console.log 'Usage: imagebin.coffee filename'
|
||||
phantom.exit()
|
||||
else
|
||||
fname = system.args[1]
|
||||
page.open 'http://imagebin.org/index.php?page=add', ->
|
||||
page.uploadFile 'input[name=image]', fname
|
||||
page.evaluate ->
|
||||
document.querySelector('input[name=nickname]').value = 'phantom'
|
||||
document.querySelector('input[name=disclaimer_agree]').click()
|
||||
document.querySelector('form').submit()
|
||||
|
||||
window.setTimeout ->
|
||||
phantom.exit()
|
||||
, 3000
|
|
@ -1,12 +1,12 @@
|
|||
// Upload an image to imagebin.org
|
||||
|
||||
var page = require('webpage').create(),
|
||||
system = require('system'),
|
||||
system = require('webpage'),
|
||||
fname;
|
||||
|
||||
if (system.args.length !== 2) {
|
||||
console.log('Usage: imagebin.js filename');
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
} else {
|
||||
fname = system.args[1];
|
||||
page.open("http://imagebin.org/index.php?page=add", function () {
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
# Use 'page.injectJs()' to load the script itself in the Page context
|
||||
|
||||
if phantom?
|
||||
page = require('webpage').create()
|
||||
|
||||
# Route "console.log()" calls from within the Page context to the main
|
||||
# Phantom context (i.e. current "this")
|
||||
page.onConsoleMessage = (msg) -> console.log(msg)
|
||||
|
||||
page.onAlert = (msg) -> console.log(msg)
|
||||
|
||||
console.log "* Script running in the Phantom context."
|
||||
console.log "* Script will 'inject' itself in a page..."
|
||||
page.open "about:blank", (status) ->
|
||||
if status is "success"
|
||||
if page.injectJs("injectme.coffee")
|
||||
console.log "... done injecting itself!"
|
||||
else
|
||||
console.log "... fail! Check the $PWD?!"
|
||||
phantom.exit()
|
||||
else
|
||||
alert "* Script running in the Page context."
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# Give the estimated location based on the IP address.
|
||||
|
||||
window.cb = (data) ->
|
||||
loc = data.city
|
||||
if data.region_name.length > 0
|
||||
loc = loc + ', ' + data.region_name
|
||||
console.log 'IP address: ' + data.ip
|
||||
console.log 'Estimated location: ' + loc
|
||||
phantom.exit()
|
||||
|
||||
el = document.createElement 'script'
|
||||
el.src = 'http://freegeoip.net/json/?callback=window.cb'
|
||||
document.body.appendChild el
|
|
@ -0,0 +1,18 @@
|
|||
page = require('webpage').create()
|
||||
system = require 'system'
|
||||
|
||||
if system.args.length is 1
|
||||
console.log 'Usage: loadspeed.coffee <some URL>'
|
||||
phantom.exit()
|
||||
else
|
||||
t = Date.now()
|
||||
address = system.args[1]
|
||||
page.open address, (status) ->
|
||||
if status isnt 'success'
|
||||
console.log('FAIL to load the address')
|
||||
else
|
||||
t = Date.now() - t
|
||||
console.log('Page title is ' + page.evaluate( (-> document.title) ))
|
||||
console.log('Loading time ' + t + ' msec')
|
||||
phantom.exit()
|
||||
|
|
@ -4,7 +4,7 @@ var page = require('webpage').create(),
|
|||
|
||||
if (system.args.length === 1) {
|
||||
console.log('Usage: loadspeed.js <some URL>');
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
} else {
|
||||
t = Date.now();
|
||||
address = system.args[1];
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
var page = require('webpage').create(),
|
||||
system = require('system');
|
||||
|
||||
if (system.args.length < 2) {
|
||||
console.log('Usage: loadurlwithoutcss.js URL');
|
||||
phantom.exit();
|
||||
}
|
||||
|
||||
var address = system.args[1];
|
||||
|
||||
page.onResourceRequested = function(requestData, request) {
|
||||
if ((/http:\/\/.+?\.css/gi).test(requestData['url']) || requestData.headers['Content-Type'] == 'text/css') {
|
||||
console.log('The url of the request is matching. Aborting: ' + requestData['url']);
|
||||
request.abort();
|
||||
}
|
||||
};
|
||||
|
||||
page.open(address, function(status) {
|
||||
if (status === 'success') {
|
||||
phantom.exit();
|
||||
} else {
|
||||
console.log('Unable to load the address!');
|
||||
phantom.exit();
|
||||
}
|
||||
});
|
File diff suppressed because it is too large
Load Diff
|
@ -1,4 +0,0 @@
|
|||
var universe = require('./universe');
|
||||
universe.start();
|
||||
console.log('The answer is' + universe.answer);
|
||||
phantom.exit();
|
|
@ -0,0 +1,13 @@
|
|||
# List movies from kids-in-mind.com
|
||||
|
||||
window.cbfunc = (data) ->
|
||||
globaldata = data
|
||||
list = data.query.results.movie
|
||||
for item in list
|
||||
console.log item.title + ' [' + item.rating.MPAA.content + ']'
|
||||
phantom.exit()
|
||||
|
||||
el = document.createElement 'script'
|
||||
el.src =
|
||||
"http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20movies.kids-in-mind&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=window.cbfunc"
|
||||
document.body.appendChild el
|
|
@ -0,0 +1,18 @@
|
|||
page = require('webpage').create()
|
||||
system = require 'system'
|
||||
|
||||
if system.args.length is 1
|
||||
console.log 'Usage: netlog.coffee <some URL>'
|
||||
phantom.exit()
|
||||
else
|
||||
address = system.args[1]
|
||||
page.onResourceRequested = (req) ->
|
||||
console.log 'requested ' + JSON.stringify(req, undefined, 4)
|
||||
|
||||
page.onResourceReceived = (res) ->
|
||||
console.log 'received ' + JSON.stringify(res, undefined, 4)
|
||||
|
||||
page.open address, (status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'FAIL to load the address'
|
||||
phantom.exit()
|
|
@ -4,7 +4,7 @@ var page = require('webpage').create(),
|
|||
|
||||
if (system.args.length === 1) {
|
||||
console.log('Usage: netlog.js <some URL>');
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
} else {
|
||||
address = system.args[1];
|
||||
|
||||
|
|
|
@ -0,0 +1,110 @@
|
|||
if not Date::toISOString
|
||||
Date::toISOString = ->
|
||||
pad = (n) ->
|
||||
if n < 10 then '0' + n else n
|
||||
ms = (n) ->
|
||||
if n < 10 then '00' + n else (if n < 100 then '0' + n else n)
|
||||
@getFullYear() + '-' +
|
||||
pad(@getMonth() + 1) + '-' +
|
||||
pad(@getDate()) + 'T' +
|
||||
pad(@getHours()) + ':' +
|
||||
pad(@getMinutes()) + ':' +
|
||||
pad(@getSeconds()) + '.' +
|
||||
ms(@getMilliseconds()) + 'Z'
|
||||
|
||||
createHAR = (address, title, startTime, resources) ->
|
||||
entries = []
|
||||
|
||||
resources.forEach (resource) ->
|
||||
request = resource.request
|
||||
startReply = resource.startReply
|
||||
endReply = resource.endReply
|
||||
|
||||
if not request or not startReply or not endReply
|
||||
return
|
||||
|
||||
entries.push
|
||||
startedDateTime: request.time.toISOString()
|
||||
time: endReply.time - request.time
|
||||
request:
|
||||
method: request.method
|
||||
url: request.url
|
||||
httpVersion: 'HTTP/1.1'
|
||||
cookies: []
|
||||
headers: request.headers
|
||||
queryString: []
|
||||
headersSize: -1
|
||||
bodySize: -1
|
||||
|
||||
response:
|
||||
status: endReply.status
|
||||
statusText: endReply.statusText
|
||||
httpVersion: 'HTTP/1.1'
|
||||
cookies: []
|
||||
headers: endReply.headers
|
||||
redirectURL: ''
|
||||
headersSize: -1
|
||||
bodySize: startReply.bodySize
|
||||
content:
|
||||
size: startReply.bodySize
|
||||
mimeType: endReply.contentType
|
||||
|
||||
cache: {}
|
||||
timings:
|
||||
blocked: 0
|
||||
dns: -1
|
||||
connect: -1
|
||||
send: 0
|
||||
wait: startReply.time - request.time
|
||||
receive: endReply.time - startReply.time
|
||||
ssl: -1
|
||||
|
||||
log:
|
||||
version: '1.2'
|
||||
creator:
|
||||
name: 'PhantomJS'
|
||||
version: phantom.version.major + '.' + phantom.version.minor + '.' + phantom.version.patch
|
||||
|
||||
pages: [
|
||||
startedDateTime: startTime.toISOString()
|
||||
id: address
|
||||
title: title
|
||||
pageTimings: {}
|
||||
]
|
||||
entries: entries
|
||||
|
||||
page = require('webpage').create()
|
||||
system = require 'system'
|
||||
|
||||
if system.args.length is 1
|
||||
console.log 'Usage: netsniff.coffee <some URL>'
|
||||
phantom.exit()
|
||||
else
|
||||
page.address = system.args[1]
|
||||
page.resources = []
|
||||
|
||||
page.onLoadStarted = ->
|
||||
page.startTime = new Date()
|
||||
|
||||
page.onResourceRequested = (req) ->
|
||||
page.resources[req.id] =
|
||||
request: req
|
||||
startReply: null
|
||||
endReply: null
|
||||
|
||||
page.onResourceReceived = (res) ->
|
||||
if res.stage is 'start'
|
||||
page.resources[res.id].startReply = res
|
||||
if res.stage is 'end'
|
||||
page.resources[res.id].endReply = res
|
||||
|
||||
page.open page.address, (status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'FAIL to load the address'
|
||||
else
|
||||
page.title = page.evaluate ->
|
||||
document.title
|
||||
|
||||
har = createHAR page.address, page.title, page.startTime, page.resources
|
||||
console.log JSON.stringify har, undefined, 4
|
||||
phantom.exit()
|
|
@ -25,12 +25,6 @@ function createHAR(address, title, startTime, resources)
|
|||
return;
|
||||
}
|
||||
|
||||
// Exclude Data URI from HAR file because
|
||||
// they aren't included in specification
|
||||
if (request.url.match(/(^data:image\/.*)/i)) {
|
||||
return;
|
||||
}
|
||||
|
||||
entries.push({
|
||||
startedDateTime: request.time.toISOString(),
|
||||
time: endReply.time - request.time,
|
||||
|
@ -67,8 +61,7 @@ function createHAR(address, title, startTime, resources)
|
|||
wait: startReply.time - request.time,
|
||||
receive: endReply.time - startReply.time,
|
||||
ssl: -1
|
||||
},
|
||||
pageref: address
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -84,9 +77,7 @@ function createHAR(address, title, startTime, resources)
|
|||
startedDateTime: startTime.toISOString(),
|
||||
id: address,
|
||||
title: title,
|
||||
pageTimings: {
|
||||
onLoad: page.endTime - page.startTime
|
||||
}
|
||||
pageTimings: {}
|
||||
}],
|
||||
entries: entries
|
||||
}
|
||||
|
@ -97,8 +88,8 @@ var page = require('webpage').create(),
|
|||
system = require('system');
|
||||
|
||||
if (system.args.length === 1) {
|
||||
console.log('Usage: netsniff.js <some URL>');
|
||||
phantom.exit(1);
|
||||
console.log('Usage: netsniff.coffee <some URL>');
|
||||
phantom.exit();
|
||||
} else {
|
||||
|
||||
page.address = system.args[1];
|
||||
|
@ -129,15 +120,13 @@ if (system.args.length === 1) {
|
|||
var har;
|
||||
if (status !== 'success') {
|
||||
console.log('FAIL to load the address');
|
||||
phantom.exit(1);
|
||||
} else {
|
||||
page.endTime = new Date();
|
||||
page.title = page.evaluate(function () {
|
||||
return document.title;
|
||||
});
|
||||
har = createHAR(page.address, page.title, page.startTime, page.resources);
|
||||
console.log(JSON.stringify(har, undefined, 4));
|
||||
phantom.exit();
|
||||
}
|
||||
phantom.exit();
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
var page = require('webpage').create(),
|
||||
system = require('system'),
|
||||
host, port, address;
|
||||
|
||||
if (system.args.length < 4) {
|
||||
console.log('Usage: openurlwithproxy.js <proxyHost> <proxyPort> <URL>');
|
||||
phantom.exit(1);
|
||||
} else {
|
||||
host = system.args[1];
|
||||
port = system.args[2];
|
||||
address = system.args[3];
|
||||
phantom.setProxy(host, port, 'manual', '', '');
|
||||
page.open(address, function (status) {
|
||||
if (status !== 'success') {
|
||||
console.log('FAIL to load the address "' +
|
||||
address + '" using proxy "' + host + ':' + port + '"');
|
||||
} else {
|
||||
console.log('Page title is ' + page.evaluate(function () {
|
||||
return document.title;
|
||||
}));
|
||||
}
|
||||
phantom.exit();
|
||||
});
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
helloWorld = () -> console.log phantom.outputEncoding + ": こんにちは、世界!"
|
||||
|
||||
console.log "Using default encoding..."
|
||||
helloWorld()
|
||||
|
||||
console.log "\nUsing other encodings..."
|
||||
for enc in ["euc-jp", "sjis", "utf8", "System"]
|
||||
do (enc) ->
|
||||
phantom.outputEncoding = enc
|
||||
helloWorld()
|
||||
|
||||
phantom.exit()
|
|
@ -1,146 +0,0 @@
|
|||
// The purpose of this is to show how and when events fire, considering 5 steps
|
||||
// happening as follows:
|
||||
//
|
||||
// 1. Load URL
|
||||
// 2. Load same URL, but adding an internal FRAGMENT to it
|
||||
// 3. Click on an internal Link, that points to another internal FRAGMENT
|
||||
// 4. Click on an external Link, that will send the page somewhere else
|
||||
// 5. Close page
|
||||
//
|
||||
// Take particular care when going through the output, to understand when
|
||||
// things happen (and in which order). Particularly, notice what DOESN'T
|
||||
// happen during step 3.
|
||||
//
|
||||
// If invoked with "-v" it will print out the Page Resources as they are
|
||||
// Requested and Received.
|
||||
//
|
||||
// NOTE.1: The "onConsoleMessage/onAlert/onPrompt/onConfirm" events are
|
||||
// registered but not used here. This is left for you to have fun with.
|
||||
// NOTE.2: This script is not here to teach you ANY JavaScript. It's aweful!
|
||||
// NOTE.3: Main audience for this are people new to PhantomJS.
|
||||
|
||||
var sys = require("system"),
|
||||
page = require("webpage").create(),
|
||||
logResources = false,
|
||||
step1url = "http://en.wikipedia.org/wiki/DOM_events",
|
||||
step2url = "http://en.wikipedia.org/wiki/DOM_events#Event_flow";
|
||||
|
||||
if (sys.args.length > 1 && sys.args[1] === "-v") {
|
||||
logResources = true;
|
||||
}
|
||||
|
||||
function printArgs() {
|
||||
var i, ilen;
|
||||
for (i = 0, ilen = arguments.length; i < ilen; ++i) {
|
||||
console.log(" arguments[" + i + "] = " + JSON.stringify(arguments[i]));
|
||||
}
|
||||
console.log("");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
page.onInitialized = function() {
|
||||
console.log("page.onInitialized");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
page.onLoadStarted = function() {
|
||||
console.log("page.onLoadStarted");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
page.onLoadFinished = function() {
|
||||
console.log("page.onLoadFinished");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
page.onUrlChanged = function() {
|
||||
console.log("page.onUrlChanged");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
page.onNavigationRequested = function() {
|
||||
console.log("page.onNavigationRequested");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
page.onRepaintRequested = function() {
|
||||
console.log("page.onRepaintRequested");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
|
||||
if (logResources === true) {
|
||||
page.onResourceRequested = function() {
|
||||
console.log("page.onResourceRequested");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
page.onResourceReceived = function() {
|
||||
console.log("page.onResourceReceived");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
}
|
||||
|
||||
page.onClosing = function() {
|
||||
console.log("page.onClosing");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
|
||||
// window.console.log(msg);
|
||||
page.onConsoleMessage = function() {
|
||||
console.log("page.onConsoleMessage");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
|
||||
// window.alert(msg);
|
||||
page.onAlert = function() {
|
||||
console.log("page.onAlert");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
// var confirmed = window.confirm(msg);
|
||||
page.onConfirm = function() {
|
||||
console.log("page.onConfirm");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
// var user_value = window.prompt(msg, default_value);
|
||||
page.onPrompt = function() {
|
||||
console.log("page.onPrompt");
|
||||
printArgs.apply(this, arguments);
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
setTimeout(function() {
|
||||
console.log("");
|
||||
console.log("### STEP 1: Load '" + step1url + "'");
|
||||
page.open(step1url);
|
||||
}, 0);
|
||||
|
||||
setTimeout(function() {
|
||||
console.log("");
|
||||
console.log("### STEP 2: Load '" + step2url + "' (load same URL plus FRAGMENT)");
|
||||
page.open(step2url);
|
||||
}, 5000);
|
||||
|
||||
setTimeout(function() {
|
||||
console.log("");
|
||||
console.log("### STEP 3: Click on page internal link (aka FRAGMENT)");
|
||||
page.evaluate(function() {
|
||||
var ev = document.createEvent("MouseEvents");
|
||||
ev.initEvent("click", true, true);
|
||||
document.querySelector("a[href='#Event_object']").dispatchEvent(ev);
|
||||
});
|
||||
}, 10000);
|
||||
|
||||
setTimeout(function() {
|
||||
console.log("");
|
||||
console.log("### STEP 4: Click on page external link");
|
||||
page.evaluate(function() {
|
||||
var ev = document.createEvent("MouseEvents");
|
||||
ev.initEvent("click", true, true);
|
||||
document.querySelector("a[title='JavaScript']").dispatchEvent(ev);
|
||||
});
|
||||
}, 15000);
|
||||
|
||||
setTimeout(function() {
|
||||
console.log("");
|
||||
console.log("### STEP 5: Close page and shutdown (with a delay)");
|
||||
page.close();
|
||||
setTimeout(function(){
|
||||
phantom.exit();
|
||||
}, 100);
|
||||
}, 20000);
|
|
@ -1,17 +0,0 @@
|
|||
var p = require("webpage").create();
|
||||
|
||||
p.onConsoleMessage = function(msg) { console.log(msg); };
|
||||
|
||||
// Calls to "callPhantom" within the page 'p' arrive here
|
||||
p.onCallback = function(msg) {
|
||||
console.log("Received by the 'phantom' main context: "+msg);
|
||||
return "Hello there, I'm coming to you from the 'phantom' context instead";
|
||||
};
|
||||
|
||||
p.evaluate(function() {
|
||||
// Return-value of the "onCallback" handler arrive here
|
||||
var callbackResponse = window.callPhantom("Hello, I'm coming to you from the 'page' context");
|
||||
console.log("Received by the 'page' context: "+callbackResponse);
|
||||
});
|
||||
|
||||
phantom.exit();
|
|
@ -0,0 +1,13 @@
|
|||
# Read the Phantom webpage '#intro' element text using jQuery and "includeJs"
|
||||
|
||||
page = require('webpage').create()
|
||||
|
||||
page.onConsoleMessage = (msg) -> console.log msg
|
||||
|
||||
page.open "http://www.phantomjs.org", (status) ->
|
||||
if status is "success"
|
||||
page.includeJs "http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", ->
|
||||
page.evaluate ->
|
||||
console.log "$(\"#intro\").text() -> " + $("#intro").text()
|
||||
phantom.exit()
|
||||
|
|
@ -10,7 +10,7 @@ page.open("http://www.phantomjs.org", function(status) {
|
|||
if ( status === "success" ) {
|
||||
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
|
||||
page.evaluate(function() {
|
||||
console.log("$(\".explanation\").text() -> " + $(".explanation").text());
|
||||
console.log("$(\"#intro\").text() -> " + $("#intro").text());
|
||||
});
|
||||
phantom.exit();
|
||||
});
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
# Find pizza in Mountain View using Yelp
|
||||
|
||||
page = require('webpage').create()
|
||||
url = 'http://lite.yelp.com/search?find_desc=pizza&find_loc=94040&find_submit=Search'
|
||||
|
||||
page.open url,
|
||||
(status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to access network'
|
||||
else
|
||||
results = page.evaluate ->
|
||||
pizza = []
|
||||
list = document.querySelectorAll 'span.address'
|
||||
for item in list
|
||||
pizza.push(item.innerText)
|
||||
return pizza
|
||||
console.log results.join('\n')
|
||||
phantom.exit()
|
|
@ -8,7 +8,7 @@ page.open(url, function (status) {
|
|||
console.log('Unable to access network');
|
||||
} else {
|
||||
var results = page.evaluate(function() {
|
||||
var list = document.querySelectorAll('address'), pizza = [], i;
|
||||
var list = document.querySelectorAll('span.address'), pizza = [], i;
|
||||
for (i = 0; i < list.length; i++) {
|
||||
pizza.push(list[i].innerText);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
# Example using HTTP POST operation
|
||||
|
||||
page = require('webpage').create()
|
||||
server = 'http://posttestserver.com/post.php?dump'
|
||||
data = 'universe=expanding&answer=42'
|
||||
|
||||
page.open server, 'post', data, (status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to post!'
|
||||
else
|
||||
console.log page.content
|
||||
phantom.exit()
|
|
@ -1,18 +0,0 @@
|
|||
// Example using HTTP POST operation
|
||||
|
||||
var page = require('webpage').create(),
|
||||
server = 'http://posttestserver.com/post.php?dump',
|
||||
data = '{"universe": "expanding", "answer": 42}';
|
||||
|
||||
var headers = {
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
page.open(server, 'post', data, headers, function (status) {
|
||||
if (status !== 'success') {
|
||||
console.log('Unable to post!');
|
||||
} else {
|
||||
console.log(page.content);
|
||||
}
|
||||
phantom.exit();
|
||||
});
|
|
@ -7,7 +7,7 @@ var page = require('webpage').create(),
|
|||
|
||||
if (system.args.length !== 2) {
|
||||
console.log('Usage: postserver.js <portnumber>');
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
}
|
||||
|
||||
var port = system.args[1];
|
||||
|
|
|
@ -1,89 +0,0 @@
|
|||
var page = require('webpage').create(),
|
||||
system = require('system');
|
||||
|
||||
function someCallback(pageNum, numPages) {
|
||||
return "<h1> someCallback: " + pageNum + " / " + numPages + "</h1>";
|
||||
}
|
||||
|
||||
if (system.args.length < 3) {
|
||||
console.log('Usage: printheaderfooter.js URL filename');
|
||||
phantom.exit(1);
|
||||
} else {
|
||||
var address = system.args[1];
|
||||
var output = system.args[2];
|
||||
page.viewportSize = { width: 600, height: 600 };
|
||||
page.paperSize = {
|
||||
format: 'A4',
|
||||
margin: "1cm",
|
||||
/* default header/footer for pages that don't have custom overwrites (see below) */
|
||||
header: {
|
||||
height: "1cm",
|
||||
contents: phantom.callback(function(pageNum, numPages) {
|
||||
if (pageNum == 1) {
|
||||
return "";
|
||||
}
|
||||
return "<h1>Header <span style='float:right'>" + pageNum + " / " + numPages + "</span></h1>";
|
||||
})
|
||||
},
|
||||
footer: {
|
||||
height: "1cm",
|
||||
contents: phantom.callback(function(pageNum, numPages) {
|
||||
if (pageNum == numPages) {
|
||||
return "";
|
||||
}
|
||||
return "<h1>Footer <span style='float:right'>" + pageNum + " / " + numPages + "</span></h1>";
|
||||
})
|
||||
}
|
||||
};
|
||||
page.open(address, function (status) {
|
||||
if (status !== 'success') {
|
||||
console.log('Unable to load the address!');
|
||||
} else {
|
||||
/* check whether the loaded page overwrites the header/footer setting,
|
||||
i.e. whether a PhantomJSPriting object exists. Use that then instead
|
||||
of our defaults above.
|
||||
|
||||
example:
|
||||
<html>
|
||||
<head>
|
||||
<script type="text/javascript">
|
||||
var PhantomJSPrinting = {
|
||||
header: {
|
||||
height: "1cm",
|
||||
contents: function(pageNum, numPages) { return pageNum + "/" + numPages; }
|
||||
},
|
||||
footer: {
|
||||
height: "1cm",
|
||||
contents: function(pageNum, numPages) { return pageNum + "/" + numPages; }
|
||||
}
|
||||
};
|
||||
</script>
|
||||
</head>
|
||||
<body><h1>asdfadsf</h1><p>asdfadsfycvx</p></body>
|
||||
</html>
|
||||
*/
|
||||
if (page.evaluate(function(){return typeof PhantomJSPrinting == "object";})) {
|
||||
paperSize = page.paperSize;
|
||||
paperSize.header.height = page.evaluate(function() {
|
||||
return PhantomJSPrinting.header.height;
|
||||
});
|
||||
paperSize.header.contents = phantom.callback(function(pageNum, numPages) {
|
||||
return page.evaluate(function(pageNum, numPages){return PhantomJSPrinting.header.contents(pageNum, numPages);}, pageNum, numPages);
|
||||
});
|
||||
paperSize.footer.height = page.evaluate(function() {
|
||||
return PhantomJSPrinting.footer.height;
|
||||
});
|
||||
paperSize.footer.contents = phantom.callback(function(pageNum, numPages) {
|
||||
return page.evaluate(function(pageNum, numPages){return PhantomJSPrinting.footer.contents(pageNum, numPages);}, pageNum, numPages);
|
||||
});
|
||||
page.paperSize = paperSize;
|
||||
console.log(page.paperSize.header.height);
|
||||
console.log(page.paperSize.footer.height);
|
||||
}
|
||||
window.setTimeout(function () {
|
||||
page.render(output);
|
||||
phantom.exit();
|
||||
}, 200);
|
||||
}
|
||||
});
|
||||
}
|
|
@ -4,7 +4,7 @@ var page = require('webpage').create(),
|
|||
if (system.args.length < 7) {
|
||||
console.log('Usage: printmargins.js URL filename LEFT TOP RIGHT BOTTOM');
|
||||
console.log(' margin examples: "1cm", "10px", "7mm", "5in"');
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
} else {
|
||||
var address = system.args[1];
|
||||
var output = system.args[2];
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
page = require('webpage').create()
|
||||
system = require 'system'
|
||||
|
||||
if system.args.length < 3 or system.args.length > 4
|
||||
console.log 'Usage: rasterize.coffee URL filename [paperwidth*paperheight|paperformat]'
|
||||
console.log ' paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"'
|
||||
phantom.exit()
|
||||
else
|
||||
address = system.args[1]
|
||||
output = system.args[2]
|
||||
page.viewportSize = { width: 600, height: 600 }
|
||||
if system.args.length is 4 and system.args[2].substr(-4) is ".pdf"
|
||||
size = system.args[3].split '*'
|
||||
if size.length is 2
|
||||
page.paperSize = { width: size[0], height: size[1], border: '0px' }
|
||||
else
|
||||
page.paperSize = { format: system.args[3], orientation: 'portrait', border: '1cm' }
|
||||
page.open address, (status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to load the address!'
|
||||
phantom.exit()
|
||||
else
|
||||
window.setTimeout (-> page.render output; phantom.exit()), 200
|
|
@ -2,42 +2,22 @@ var page = require('webpage').create(),
|
|||
system = require('system'),
|
||||
address, output, size;
|
||||
|
||||
if (system.args.length < 3 || system.args.length > 5) {
|
||||
console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]');
|
||||
if (system.args.length < 3 || system.args.length > 4) {
|
||||
console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat]');
|
||||
console.log(' paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"');
|
||||
console.log(' image (png/jpg output) examples: "1920px" entire page, window width 1920px');
|
||||
console.log(' "800px*600px" window, clipped to 800x600');
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
} else {
|
||||
address = system.args[1];
|
||||
output = system.args[2];
|
||||
page.viewportSize = { width: 600, height: 600 };
|
||||
if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") {
|
||||
size = system.args[3].split('*');
|
||||
if (system.args.length === 3 && system.args[1].substr(-4) === ".pdf") {
|
||||
size = system.args[2].split('*');
|
||||
page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' }
|
||||
: { format: system.args[3], orientation: 'portrait', margin: '1cm' };
|
||||
} else if (system.args.length > 3 && system.args[3].substr(-2) === "px") {
|
||||
size = system.args[3].split('*');
|
||||
if (size.length === 2) {
|
||||
pageWidth = parseInt(size[0], 10);
|
||||
pageHeight = parseInt(size[1], 10);
|
||||
page.viewportSize = { width: pageWidth, height: pageHeight };
|
||||
page.clipRect = { top: 0, left: 0, width: pageWidth, height: pageHeight };
|
||||
} else {
|
||||
console.log("size:", system.args[3]);
|
||||
pageWidth = parseInt(system.args[3], 10);
|
||||
pageHeight = parseInt(pageWidth * 3/4, 10); // it's as good an assumption as any
|
||||
console.log ("pageHeight:",pageHeight);
|
||||
page.viewportSize = { width: pageWidth, height: pageHeight };
|
||||
}
|
||||
}
|
||||
if (system.args.length > 4) {
|
||||
page.zoomFactor = system.args[4];
|
||||
: { format: system.args[2], orientation: 'portrait', margin: '1cm' };
|
||||
}
|
||||
page.open(address, function (status) {
|
||||
if (status !== 'success') {
|
||||
console.log('Unable to load the address!');
|
||||
phantom.exit(1);
|
||||
} else {
|
||||
window.setTimeout(function () {
|
||||
page.render(output);
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
# Render Multiple URLs to file
|
||||
# FIXME: For now it is fine with pure domain names: don't think it would work with paths and stuff like that
|
||||
|
||||
system = require 'system'
|
||||
|
||||
# Extend the Array Prototype with a 'foreach'
|
||||
Array.prototype.forEach = (action) ->
|
||||
for i, j in this
|
||||
action j, i, _len
|
||||
|
||||
# Render a given url to a given file
|
||||
# @param url URL to render
|
||||
# @param file File to render to
|
||||
# @param callback Callback function
|
||||
renderUrlToFile = (url, file, callback) ->
|
||||
page = require('webpage').create()
|
||||
page.viewportSize = { width: 800, height : 600 }
|
||||
page.settings.userAgent = 'Phantom.js bot'
|
||||
|
||||
page.open url, (status) ->
|
||||
if status isnt 'success'
|
||||
console.log "Unable to render '#{url}'"
|
||||
else
|
||||
page.render file
|
||||
|
||||
delete page
|
||||
callback url, file
|
||||
|
||||
# Read the passed args
|
||||
if system.args.length > 1
|
||||
arrayOfUrls = Array.prototype.slice.call system.args, 1
|
||||
else
|
||||
# Default (no args passed)
|
||||
console.log 'Usage: phantomjs render_multi_url.coffee [domain.name1, domain.name2, ...]'
|
||||
arrayOfUrls = [
|
||||
'www.google.com',
|
||||
'www.bbc.co.uk',
|
||||
'www.phantomjs.org'
|
||||
]
|
||||
|
||||
# For each URL
|
||||
arrayOfUrls.forEach (pos, url, total) ->
|
||||
file_name = "./#{url}.png"
|
||||
|
||||
# Render to a file
|
||||
renderUrlToFile "http://#{url}", file_name, (url, file) ->
|
||||
console.log "Rendered '#{url}' at '#{file}'"
|
||||
if pos is total - 1
|
||||
# Close Phantom if it's the last URL
|
||||
phantom.exit()
|
|
@ -1,73 +1,62 @@
|
|||
// Render Multiple URLs to file
|
||||
// FIXME: For now it is fine with pure domain names: don't think it would work with paths and stuff like that
|
||||
|
||||
var RenderUrlsToFile, arrayOfUrls, system;
|
||||
var system = require('system');
|
||||
|
||||
system = require("system");
|
||||
|
||||
/*
|
||||
Render given urls
|
||||
@param array of URLs to render
|
||||
@param callbackPerUrl Function called after finishing each URL, including the last URL
|
||||
@param callbackFinal Function called after finishing everything
|
||||
*/
|
||||
RenderUrlsToFile = function(urls, callbackPerUrl, callbackFinal) {
|
||||
var getFilename, next, page, retrieve, urlIndex, webpage;
|
||||
urlIndex = 0;
|
||||
webpage = require("webpage");
|
||||
page = null;
|
||||
getFilename = function() {
|
||||
return "rendermulti-" + urlIndex + ".png";
|
||||
};
|
||||
next = function(status, url, file) {
|
||||
page.close();
|
||||
callbackPerUrl(status, url, file);
|
||||
return retrieve();
|
||||
};
|
||||
retrieve = function() {
|
||||
var url;
|
||||
if (urls.length > 0) {
|
||||
url = urls.shift();
|
||||
urlIndex++;
|
||||
page = webpage.create();
|
||||
page.viewportSize = {
|
||||
width: 800,
|
||||
height: 600
|
||||
};
|
||||
page.settings.userAgent = "Phantom.js bot";
|
||||
return page.open("http://" + url, function(status) {
|
||||
var file;
|
||||
file = getFilename();
|
||||
if (status === "success") {
|
||||
return window.setTimeout((function() {
|
||||
page.render(file);
|
||||
return next(status, url, file);
|
||||
}), 200);
|
||||
} else {
|
||||
return next(status, url, file);
|
||||
// Extend the Array Prototype with a 'foreach'
|
||||
Array.prototype.forEach = function (action) {
|
||||
var i, len;
|
||||
for ( i = 0, len = this.length; i < len; ++i ) {
|
||||
action(i, this[i], len);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
return callbackFinal();
|
||||
}
|
||||
};
|
||||
return retrieve();
|
||||
};
|
||||
|
||||
arrayOfUrls = null;
|
||||
/**
|
||||
* Render a given url to a given file
|
||||
* @param url URL to render
|
||||
* @param file File to render to
|
||||
* @param callback Callback function
|
||||
*/
|
||||
function renderUrlToFile(url, file, callback) {
|
||||
var page = require('webpage').create();
|
||||
page.viewportSize = { width: 800, height : 600 };
|
||||
page.settings.userAgent = "Phantom.js bot";
|
||||
|
||||
if (system.args.length > 1) {
|
||||
arrayOfUrls = Array.prototype.slice.call(system.args, 1);
|
||||
} else {
|
||||
console.log("Usage: phantomjs render_multi_url.js [domain.name1, domain.name2, ...]");
|
||||
arrayOfUrls = ["www.google.com", "www.bbc.co.uk", "www.phantomjs.org"];
|
||||
page.open(url, function(status){
|
||||
if ( status !== "success") {
|
||||
console.log("Unable to render '"+url+"'");
|
||||
} else {
|
||||
page.render(file);
|
||||
}
|
||||
delete page;
|
||||
callback(url, file);
|
||||
});
|
||||
}
|
||||
|
||||
RenderUrlsToFile(arrayOfUrls, (function(status, url, file) {
|
||||
if (status !== "success") {
|
||||
return console.log("Unable to render '" + url + "'");
|
||||
} else {
|
||||
return console.log("Rendered '" + url + "' at '" + file + "'");
|
||||
// Read the passed args
|
||||
var arrayOfUrls;
|
||||
if ( system.args.length > 1 ) {
|
||||
arrayOfUrls = Array.prototype.slice.call(system.args, 1);
|
||||
} else {
|
||||
// Default (no args passed)
|
||||
console.log("Usage: phantomjs render_multi_url.js [domain.name1, domain.name2, ...]");
|
||||
arrayOfUrls = [
|
||||
'www.google.com',
|
||||
'www.bbc.co.uk',
|
||||
'www.phantomjs.org'
|
||||
];
|
||||
}
|
||||
|
||||
// For each URL
|
||||
arrayOfUrls.forEach(function(pos, url, total){
|
||||
var file_name = "./" + url + ".png";
|
||||
|
||||
// Render to a file
|
||||
renderUrlToFile("http://"+url, file_name, function(url, file){
|
||||
console.log("Rendered '"+url+"' at '"+file+"'");
|
||||
if ( pos === total-1 ) {
|
||||
// Close Phantom if it's the last URL
|
||||
phantom.exit();
|
||||
}
|
||||
}), function() {
|
||||
return phantom.exit();
|
||||
});
|
||||
});
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
system = require 'system'
|
||||
|
||||
##
|
||||
# Wait until the test condition is true or a timeout occurs. Useful for waiting
|
||||
# on a server response or for a ui change (fadeIn, etc.) to occur.
|
||||
#
|
||||
# @param testFx javascript condition that evaluates to a boolean,
|
||||
# it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||
# as a callback function.
|
||||
# @param onReady what to do when testFx condition is fulfilled,
|
||||
# it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||
# as a callback function.
|
||||
# @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
|
||||
##
|
||||
waitFor = (testFx, onReady, timeOutMillis=3000) ->
|
||||
start = new Date().getTime()
|
||||
condition = false
|
||||
f = ->
|
||||
if (new Date().getTime() - start < timeOutMillis) and not condition
|
||||
# If not time-out yet and condition not yet fulfilled
|
||||
condition = (if typeof testFx is 'string' then eval testFx else testFx()) #< defensive code
|
||||
else
|
||||
if not condition
|
||||
# If condition still not fulfilled (timeout but condition is 'false')
|
||||
console.log "'waitFor()' timeout"
|
||||
phantom.exit(1)
|
||||
else
|
||||
# Condition fulfilled (timeout and/or condition is 'true')
|
||||
console.log "'waitFor()' finished in #{new Date().getTime() - start}ms."
|
||||
if typeof onReady is 'string' then eval onReady else onReady() #< Do what it's supposed to do once the condition is fulfilled
|
||||
clearInterval interval #< Stop this interval
|
||||
interval = setInterval f, 100 #< repeat check every 100ms
|
||||
|
||||
if system.args.length isnt 2
|
||||
console.log 'Usage: run-jasmine.coffee URL'
|
||||
phantom.exit()
|
||||
|
||||
page = require('webpage').create()
|
||||
|
||||
# Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
|
||||
page.onConsoleMessage = (msg) ->
|
||||
console.log msg
|
||||
|
||||
page.open system.args[1], (status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to access network'
|
||||
phantom.exit()
|
||||
else
|
||||
waitFor ->
|
||||
page.evaluate ->
|
||||
if document.body.querySelector '.finished-at'
|
||||
return true
|
||||
return false
|
||||
, ->
|
||||
page.evaluate ->
|
||||
console.log document.body.querySelector('.description').innerText
|
||||
list = document.body.querySelectorAll('.failed > .description, .failed > .messages > .resultMessage')
|
||||
for el in list
|
||||
console.log el.innerText
|
||||
|
||||
phantom.exit()
|
|
@ -38,7 +38,7 @@ function waitFor(testFx, onReady, timeOutMillis) {
|
|||
|
||||
if (system.args.length !== 2) {
|
||||
console.log('Usage: run-jasmine.js URL');
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
}
|
||||
|
||||
var page = require('webpage').create();
|
||||
|
@ -50,42 +50,30 @@ page.onConsoleMessage = function(msg) {
|
|||
|
||||
page.open(system.args[1], function(status){
|
||||
if (status !== "success") {
|
||||
console.log("Unable to open " + system.args[1]);
|
||||
phantom.exit(1);
|
||||
console.log("Unable to access network");
|
||||
phantom.exit();
|
||||
} else {
|
||||
waitFor(function(){
|
||||
return page.evaluate(function(){
|
||||
return document.body.querySelector('.symbolSummary .pending') === null
|
||||
if (document.body.querySelector('.runner .description')) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}, function(){
|
||||
var exitCode = page.evaluate(function(){
|
||||
try {
|
||||
console.log('');
|
||||
page.evaluate(function(){
|
||||
console.log(document.body.querySelector('.description').innerText);
|
||||
var list = document.body.querySelectorAll('.results > #details > .specDetail.failed');
|
||||
if (list && list.length > 0) {
|
||||
console.log('');
|
||||
console.log(list.length + ' test(s) FAILED:');
|
||||
list = document.body.querySelectorAll('div.jasmine_reporter > div.suite.failed');
|
||||
for (i = 0; i < list.length; ++i) {
|
||||
var el = list[i],
|
||||
desc = el.querySelector('.description'),
|
||||
msg = el.querySelector('.resultMessage.fail');
|
||||
console.log('');
|
||||
console.log(desc.innerText);
|
||||
console.log(msg.innerText);
|
||||
el = list[i];
|
||||
desc = el.querySelectorAll('.description');
|
||||
console.log('');
|
||||
for (j = 0; j < desc.length; ++j) {
|
||||
console.log(desc[j].innerText);
|
||||
}
|
||||
return 1;
|
||||
} else {
|
||||
console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText);
|
||||
return 0;
|
||||
}
|
||||
} catch (ex) {
|
||||
console.log(ex);
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
phantom.exit(exitCode);
|
||||
phantom.exit();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,92 +0,0 @@
|
|||
var system = require('system');
|
||||
|
||||
/**
|
||||
* Wait until the test condition is true or a timeout occurs. Useful for waiting
|
||||
* on a server response or for a ui change (fadeIn, etc.) to occur.
|
||||
*
|
||||
* @param testFx javascript condition that evaluates to a boolean,
|
||||
* it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||
* as a callback function.
|
||||
* @param onReady what to do when testFx condition is fulfilled,
|
||||
* it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||
* as a callback function.
|
||||
* @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
|
||||
*/
|
||||
function waitFor(testFx, onReady, timeOutMillis) {
|
||||
var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3001, //< Default Max Timeout is 3s
|
||||
start = new Date().getTime(),
|
||||
condition = false,
|
||||
interval = setInterval(function() {
|
||||
if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
|
||||
// If not time-out yet and condition not yet fulfilled
|
||||
condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
|
||||
} else {
|
||||
if(!condition) {
|
||||
// If condition still not fulfilled (timeout but condition is 'false')
|
||||
console.log("'waitFor()' timeout");
|
||||
phantom.exit(1);
|
||||
} else {
|
||||
// Condition fulfilled (timeout and/or condition is 'true')
|
||||
console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
|
||||
typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
|
||||
clearInterval(interval); //< Stop this interval
|
||||
}
|
||||
}
|
||||
}, 100); //< repeat check every 100ms
|
||||
};
|
||||
|
||||
|
||||
if (system.args.length !== 2) {
|
||||
console.log('Usage: run-jasmine.js URL');
|
||||
phantom.exit(1);
|
||||
}
|
||||
|
||||
var page = require('webpage').create();
|
||||
|
||||
// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
|
||||
page.onConsoleMessage = function(msg) {
|
||||
console.log(msg);
|
||||
};
|
||||
|
||||
page.open(system.args[1], function(status){
|
||||
if (status !== "success") {
|
||||
console.log("Unable to access network");
|
||||
phantom.exit();
|
||||
} else {
|
||||
waitFor(function(){
|
||||
return page.evaluate(function(){
|
||||
return document.body.querySelector('.symbolSummary .pending') === null
|
||||
});
|
||||
}, function(){
|
||||
var exitCode = page.evaluate(function(){
|
||||
console.log('');
|
||||
|
||||
var el = document.body.querySelector('.banner');
|
||||
var banner = el.querySelector('.title').innerText + " " +
|
||||
el.querySelector('.version').innerText + " " +
|
||||
el.querySelector('.duration').innerText;
|
||||
console.log(banner);
|
||||
|
||||
var list = document.body.querySelectorAll('.results > .failures > .spec-detail.failed');
|
||||
if (list && list.length > 0) {
|
||||
console.log('');
|
||||
console.log(list.length + ' test(s) FAILED:');
|
||||
for (i = 0; i < list.length; ++i) {
|
||||
var el = list[i],
|
||||
desc = el.querySelector('.description'),
|
||||
msg = el.querySelector('.messages > .result-message');
|
||||
console.log('');
|
||||
console.log(desc.innerText);
|
||||
console.log(msg.innerText);
|
||||
console.log('');
|
||||
}
|
||||
return 1;
|
||||
} else {
|
||||
console.log(document.body.querySelector('.alert > .bar.passed').innerText);
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
phantom.exit(exitCode);
|
||||
});
|
||||
}
|
||||
});
|
|
@ -0,0 +1,64 @@
|
|||
system = require 'system'
|
||||
|
||||
##
|
||||
# Wait until the test condition is true or a timeout occurs. Useful for waiting
|
||||
# on a server response or for a ui change (fadeIn, etc.) to occur.
|
||||
#
|
||||
# @param testFx javascript condition that evaluates to a boolean,
|
||||
# it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||
# as a callback function.
|
||||
# @param onReady what to do when testFx condition is fulfilled,
|
||||
# it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||
# as a callback function.
|
||||
# @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
|
||||
##
|
||||
waitFor = (testFx, onReady, timeOutMillis=3000) ->
|
||||
start = new Date().getTime()
|
||||
condition = false
|
||||
f = ->
|
||||
if (new Date().getTime() - start < timeOutMillis) and not condition
|
||||
# If not time-out yet and condition not yet fulfilled
|
||||
condition = (if typeof testFx is 'string' then eval testFx else testFx()) #< defensive code
|
||||
else
|
||||
if not condition
|
||||
# If condition still not fulfilled (timeout but condition is 'false')
|
||||
console.log "'waitFor()' timeout"
|
||||
phantom.exit(1)
|
||||
else
|
||||
# Condition fulfilled (timeout and/or condition is 'true')
|
||||
console.log "'waitFor()' finished in #{new Date().getTime() - start}ms."
|
||||
if typeof onReady is 'string' then eval onReady else onReady() #< Do what it's supposed to do once the condition is fulfilled
|
||||
clearInterval interval #< Stop this interval
|
||||
interval = setInterval f, 100 #< repeat check every 100ms
|
||||
|
||||
if system.args.length isnt 2
|
||||
console.log 'Usage: run-qunit.coffee URL'
|
||||
phantom.exit(1)
|
||||
|
||||
page = require('webpage').create()
|
||||
|
||||
# Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
|
||||
page.onConsoleMessage = (msg) ->
|
||||
console.log msg
|
||||
|
||||
page.open system.args[1], (status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to access network'
|
||||
phantom.exit(1)
|
||||
else
|
||||
waitFor ->
|
||||
page.evaluate ->
|
||||
el = document.getElementById 'qunit-testresult'
|
||||
if el and el.innerText.match 'completed'
|
||||
return true
|
||||
return false
|
||||
, ->
|
||||
failedNum = page.evaluate ->
|
||||
el = document.getElementById 'qunit-testresult'
|
||||
console.log el.innerText
|
||||
try
|
||||
return el.getElementsByClassName('failed')[0].innerHTML
|
||||
catch e
|
||||
return 10000
|
||||
|
||||
phantom.exit if parseInt(failedNum, 10) > 0 then 1 else 0
|
|
@ -0,0 +1,16 @@
|
|||
# List all the files in a Tree of Directories
|
||||
system = require 'system'
|
||||
|
||||
if system.args.length != 2
|
||||
console.log "Usage: phantomjs scandir.coffee DIRECTORY_TO_SCAN"
|
||||
phantom.exit()
|
||||
scanDirectory = (path) ->
|
||||
fs = require 'fs'
|
||||
if fs.exists(path) and fs.isFile(path)
|
||||
console.log path
|
||||
else if fs.isDirectory(path)
|
||||
fs.list(path).forEach (e) ->
|
||||
scanDirectory path + "/" + e if e != "." and e != ".."
|
||||
|
||||
scanDirectory system.args[1]
|
||||
phantom.exit()
|
|
@ -3,7 +3,7 @@ var system = require('system');
|
|||
|
||||
if (system.args.length !== 2) {
|
||||
console.log("Usage: phantomjs scandir.js DIRECTORY_TO_SCAN");
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
}
|
||||
|
||||
var scanDirectory = function (path) {
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
# Show BBC seasonal food list.
|
||||
|
||||
window.cbfunc = (data) ->
|
||||
list = data.query.results.results.result
|
||||
names = ['January', 'February', 'March',
|
||||
'April', 'May', 'June',
|
||||
'July', 'August', 'September',
|
||||
'October', 'November', 'December']
|
||||
for item in list
|
||||
console.log [item.name.replace(/\s/ig, ' '), ':',
|
||||
names[item.atItsBestUntil], 'to',
|
||||
names[item.atItsBestFrom]].join(' ')
|
||||
phantom.exit()
|
||||
|
||||
el = document.createElement 'script'
|
||||
el.src = 'http://query.yahooapis.com/v1/public/yql?q=SELECT%20*%20FROM%20bbc.goodfood.seasonal%3B&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=window.cbfunc'
|
||||
document.body.appendChild el
|
|
@ -5,7 +5,7 @@ var host, port;
|
|||
|
||||
if (system.args.length !== 2) {
|
||||
console.log('Usage: server.js <some port>');
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
} else {
|
||||
port = system.args[1];
|
||||
var listening = server.listen(port, function (request, response) {
|
||||
|
|
|
@ -3,7 +3,7 @@ var port, server, service,
|
|||
|
||||
if (system.args.length !== 2) {
|
||||
console.log('Usage: serverkeepalive.js <portnumber>');
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
} else {
|
||||
port = system.args[1];
|
||||
server = require('webserver').create();
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
system = require 'system'
|
||||
|
||||
if system.args.length is 1
|
||||
console.log "Usage: simpleserver.coffee <portnumber>"
|
||||
phantom.exit()
|
||||
else
|
||||
port = system.args[1]
|
||||
server = require("webserver").create()
|
||||
|
||||
service = server.listen(port, (request, response) ->
|
||||
|
||||
console.log "Request at " + new Date()
|
||||
console.log JSON.stringify(request, null, 4)
|
||||
|
||||
response.statusCode = 200
|
||||
response.headers =
|
||||
Cache: "no-cache"
|
||||
"Content-Type": "text/html"
|
||||
|
||||
response.write "<html>"
|
||||
response.write "<head>"
|
||||
response.write "<title>Hello, world!</title>"
|
||||
response.write "</head>"
|
||||
response.write "<body>"
|
||||
response.write "<p>This is from PhantomJS web server.</p>"
|
||||
response.write "<p>Request data:</p>"
|
||||
response.write "<pre>"
|
||||
response.write JSON.stringify(request, null, 4)
|
||||
response.write "</pre>"
|
||||
response.write "</body>"
|
||||
response.write "</html>"
|
||||
response.close()
|
||||
)
|
||||
if service
|
||||
console.log "Web server running on port " + port
|
||||
else
|
||||
console.log "Error: Could not create web server listening on port " + port
|
||||
phantom.exit()
|
|
@ -3,7 +3,7 @@ var port, server, service,
|
|||
|
||||
if (system.args.length !== 2) {
|
||||
console.log('Usage: simpleserver.js <portnumber>');
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
} else {
|
||||
port = system.args[1];
|
||||
server = require('webserver').create();
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
###
|
||||
Sort integers from the command line in a very ridiculous way: leveraging timeouts :P
|
||||
###
|
||||
|
||||
system = require 'system'
|
||||
|
||||
if system.args.length < 2
|
||||
console.log "Usage: phantomjs sleepsort.coffee PUT YOUR INTEGERS HERE SEPARATED BY SPACES"
|
||||
phantom.exit()
|
||||
else
|
||||
sortedCount = 0
|
||||
args = Array.prototype.slice.call(system.args, 1)
|
||||
for int in args
|
||||
setTimeout (do (int) ->
|
||||
->
|
||||
console.log int
|
||||
++sortedCount
|
||||
phantom.exit() if sortedCount is args.length),
|
||||
int
|
||||
|
|
@ -15,11 +15,11 @@ function sleepSort(array, callback) {
|
|||
}
|
||||
}
|
||||
|
||||
if ( system.args.length < 2 ) {
|
||||
if ( system.args < 2 ) {
|
||||
console.log("Usage: phantomjs sleepsort.js PUT YOUR INTEGERS HERE SEPARATED BY SPACES");
|
||||
phantom.exit(1);
|
||||
phantom.exit();
|
||||
} else {
|
||||
sleepSort(system.args.slice(1), function() {
|
||||
sleepSort(Array.prototype.slice.call(system.args, 1), function() {
|
||||
phantom.exit();
|
||||
});
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
var system = require('system');
|
||||
|
||||
system.stdout.write('Hello, system.stdout.write!');
|
||||
system.stdout.writeLine('\nHello, system.stdout.writeLine!');
|
||||
|
||||
system.stderr.write('Hello, system.stderr.write!');
|
||||
system.stderr.writeLine('\nHello, system.stderr.writeLine!');
|
||||
|
||||
system.stdout.writeLine('system.stdin.readLine(): ');
|
||||
var line = system.stdin.readLine();
|
||||
system.stdout.writeLine(JSON.stringify(line));
|
||||
|
||||
// This is essentially a `readAll`
|
||||
system.stdout.writeLine('system.stdin.read(5): (ctrl+D to end)');
|
||||
var input = system.stdin.read(5);
|
||||
system.stdout.writeLine(JSON.stringify(input));
|
||||
|
||||
phantom.exit(0);
|
|
@ -0,0 +1,17 @@
|
|||
page = require('webpage').create()
|
||||
|
||||
page.viewportSize = { width: 320, height: 480 }
|
||||
|
||||
page.open 'http://news.google.com/news/i/section?&topic=t',
|
||||
(status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to access the network!'
|
||||
else
|
||||
page.evaluate ->
|
||||
body = document.body
|
||||
body.style.backgroundColor = '#fff'
|
||||
body.querySelector('div#title-block').style.display = 'none'
|
||||
body.querySelector('form#edition-picker-form')
|
||||
.parentElement.parentElement.style.display = 'none'
|
||||
page.render 'technews.png'
|
||||
phantom.exit()
|
|
@ -0,0 +1,31 @@
|
|||
# Get twitter status for given account (or for the default one, "HeadlessPhantom")
|
||||
|
||||
page = require('webpage').create()
|
||||
system = require 'system'
|
||||
twitterId = 'HeadlessPhantom' #< default value
|
||||
|
||||
# Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
|
||||
page.onConsoleMessage = (msg) ->
|
||||
console.log msg
|
||||
|
||||
# Print usage message, if no twitter ID is passed
|
||||
if system.args.length < 2
|
||||
console.log 'Usage: tweets.coffee [twitter ID]'
|
||||
else
|
||||
twitterId = system.args[1]
|
||||
|
||||
# Heading
|
||||
console.log "*** Latest tweets from @#{twitterId} ***\n"
|
||||
|
||||
# Open Twitter Mobile and, onPageLoad, do...
|
||||
page.open encodeURI("http://mobile.twitter.com/#{twitterId}"), (status) ->
|
||||
# Check for page load success
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to access network'
|
||||
else
|
||||
# Execute some DOM inspection within the page context
|
||||
page.evaluate ->
|
||||
list = document.querySelectorAll 'span.status'
|
||||
for i, j in list
|
||||
console.log "#{j + 1}: #{i.innerHTML.replace /<.*?>/g, ''}"
|
||||
phantom.exit()
|
|
@ -1,8 +1,8 @@
|
|||
// Get twitter status for given account (or for the default one, "PhantomJS")
|
||||
// Get twitter status for given account (or for the default one, "HeadlessPhantom")
|
||||
|
||||
var page = require('webpage').create(),
|
||||
system = require('system'),
|
||||
twitterId = "PhantomJS"; //< default value
|
||||
twitterId = "HeadlessPhantom"; //< default value
|
||||
|
||||
// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
|
||||
page.onConsoleMessage = function(msg) {
|
||||
|
@ -27,9 +27,9 @@ page.open(encodeURI("http://mobile.twitter.com/" + twitterId), function (status)
|
|||
} else {
|
||||
// Execute some DOM inspection within the page context
|
||||
page.evaluate(function() {
|
||||
var list = document.querySelectorAll('div.tweet-text');
|
||||
var list = document.querySelectorAll('span.status');
|
||||
for (var i = 0; i < list.length; ++i) {
|
||||
console.log((i + 1) + ": " + list[i].innerText);
|
||||
console.log((i + 1) + ": " + list[i].innerHTML.replace(/<.*?>/g, ''));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
// This is to be used by "module.js" (and "module.coffee") example(s).
|
||||
// There should NOT be a "universe.coffee" as only 1 of the 2 would
|
||||
// ever be loaded unless the file extension was specified.
|
||||
|
||||
exports.answer = 42;
|
||||
|
||||
exports.start = function () {
|
||||
console.log('Starting the universe....');
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# Modify global object at the page initialization.
|
||||
# In this example, effectively Math.random() always returns 0.42.
|
||||
|
||||
page = require('webpage').create()
|
||||
page.onInitialized = ->
|
||||
page.evaluate ->
|
||||
Math.random = ->
|
||||
42 / 100
|
||||
|
||||
page.open "http://ariya.github.com/js/random/", (status) ->
|
||||
if status != "success"
|
||||
console.log "Network error."
|
||||
else
|
||||
console.log page.evaluate(->
|
||||
document.getElementById("numbers").textContent
|
||||
)
|
||||
phantom.exit()
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
page = require('webpage').create()
|
||||
|
||||
console.log 'The default user agent is ' + page.settings.userAgent
|
||||
|
||||
page.settings.userAgent = 'SpecialAgent'
|
||||
page.open 'http://www.httpuseragent.org', (status) ->
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to access network'
|
||||
else
|
||||
console.log page.evaluate -> document.getElementById('myagent').innerText
|
||||
phantom.exit()
|
|
@ -0,0 +1,5 @@
|
|||
console.log 'using PhantomJS version ' +
|
||||
phantom.version.major + '.' +
|
||||
phantom.version.minor + '.' +
|
||||
phantom.version.patch
|
||||
phantom.exit()
|
|
@ -0,0 +1,48 @@
|
|||
##
|
||||
# Wait until the test condition is true or a timeout occurs. Useful for waiting
|
||||
# on a server response or for a ui change (fadeIn, etc.) to occur.
|
||||
#
|
||||
# @param testFx javascript condition that evaluates to a boolean,
|
||||
# it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||
# as a callback function.
|
||||
# @param onReady what to do when testFx condition is fulfilled,
|
||||
# it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
|
||||
# as a callback function.
|
||||
# @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
|
||||
##
|
||||
waitFor = (testFx, onReady, timeOutMillis=3000) ->
|
||||
start = new Date().getTime()
|
||||
condition = false
|
||||
f = ->
|
||||
if (new Date().getTime() - start < timeOutMillis) and not condition
|
||||
# If not time-out yet and condition not yet fulfilled
|
||||
condition = (if typeof testFx is 'string' then eval testFx else testFx()) #< defensive code
|
||||
else
|
||||
if not condition
|
||||
# If condition still not fulfilled (timeout but condition is 'false')
|
||||
console.log "'waitFor()' timeout"
|
||||
phantom.exit(1)
|
||||
else
|
||||
# Condition fulfilled (timeout and/or condition is 'true')
|
||||
console.log "'waitFor()' finished in #{new Date().getTime() - start}ms."
|
||||
if typeof onReady is 'string' then eval onReady else onReady() #< Do what it's supposed to do once the condition is fulfilled
|
||||
clearInterval interval #< Stop this interval
|
||||
interval = setInterval f, 250 #< repeat check every 250ms
|
||||
|
||||
|
||||
page = require('webpage').create()
|
||||
|
||||
# Open Twitter on 'sencha' profile and, onPageLoad, do...
|
||||
page.open 'http://twitter.com/#!/sencha', (status) ->
|
||||
# Check for page load success
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to access network'
|
||||
else
|
||||
# Wait for 'signin-dropdown' to be visible
|
||||
waitFor ->
|
||||
# Check in the page if a specific element is now visible
|
||||
page.evaluate ->
|
||||
$('#signin-dropdown').is ':visible'
|
||||
, ->
|
||||
console.log 'The sign-in dialog should be visible now.'
|
||||
phantom.exit()
|
|
@ -1,73 +0,0 @@
|
|||
var p = require("webpage").create();
|
||||
|
||||
function pageTitle(page) {
|
||||
return page.evaluate(function(){
|
||||
return window.document.title;
|
||||
});
|
||||
}
|
||||
|
||||
function setPageTitle(page, newTitle) {
|
||||
page.evaluate(function(newTitle){
|
||||
window.document.title = newTitle;
|
||||
}, newTitle);
|
||||
}
|
||||
|
||||
p.open("../test/webpage-spec-frames/index.html", function(status) {
|
||||
console.log("pageTitle(): " + pageTitle(p));
|
||||
console.log("currentFrameName(): "+p.currentFrameName());
|
||||
console.log("childFramesCount(): "+p.childFramesCount());
|
||||
console.log("childFramesName(): "+p.childFramesName());
|
||||
console.log("setPageTitle(CURRENT TITLE+'-visited')"); setPageTitle(p, pageTitle(p) + "-visited");
|
||||
console.log("");
|
||||
|
||||
console.log("p.switchToChildFrame(\"frame1\"): "+p.switchToChildFrame("frame1"));
|
||||
console.log("pageTitle(): " + pageTitle(p));
|
||||
console.log("currentFrameName(): "+p.currentFrameName());
|
||||
console.log("childFramesCount(): "+p.childFramesCount());
|
||||
console.log("childFramesName(): "+p.childFramesName());
|
||||
console.log("setPageTitle(CURRENT TITLE+'-visited')"); setPageTitle(p, pageTitle(p) + "-visited");
|
||||
console.log("");
|
||||
|
||||
console.log("p.switchToChildFrame(\"frame1-2\"): "+p.switchToChildFrame("frame1-2"));
|
||||
console.log("pageTitle(): " + pageTitle(p));
|
||||
console.log("currentFrameName(): "+p.currentFrameName());
|
||||
console.log("childFramesCount(): "+p.childFramesCount());
|
||||
console.log("childFramesName(): "+p.childFramesName());
|
||||
console.log("setPageTitle(CURRENT TITLE+'-visited')"); setPageTitle(p, pageTitle(p) + "-visited");
|
||||
console.log("");
|
||||
|
||||
console.log("p.switchToParentFrame(): "+p.switchToParentFrame());
|
||||
console.log("pageTitle(): " + pageTitle(p));
|
||||
console.log("currentFrameName(): "+p.currentFrameName());
|
||||
console.log("childFramesCount(): "+p.childFramesCount());
|
||||
console.log("childFramesName(): "+p.childFramesName());
|
||||
console.log("setPageTitle(CURRENT TITLE+'-visited')"); setPageTitle(p, pageTitle(p) + "-visited");
|
||||
console.log("");
|
||||
|
||||
console.log("p.switchToChildFrame(0): "+p.switchToChildFrame(0));
|
||||
console.log("pageTitle(): " + pageTitle(p));
|
||||
console.log("currentFrameName(): "+p.currentFrameName());
|
||||
console.log("childFramesCount(): "+p.childFramesCount());
|
||||
console.log("childFramesName(): "+p.childFramesName());
|
||||
console.log("setPageTitle(CURRENT TITLE+'-visited')"); setPageTitle(p, pageTitle(p) + "-visited");
|
||||
console.log("");
|
||||
|
||||
console.log("p.switchToMainFrame()"); p.switchToMainFrame();
|
||||
console.log("pageTitle(): " + pageTitle(p));
|
||||
console.log("currentFrameName(): "+p.currentFrameName());
|
||||
console.log("childFramesCount(): "+p.childFramesCount());
|
||||
console.log("childFramesName(): "+p.childFramesName());
|
||||
console.log("setPageTitle(CURRENT TITLE+'-visited')"); setPageTitle(p, pageTitle(p) + "-visited");
|
||||
console.log("");
|
||||
|
||||
console.log("p.switchToChildFrame(\"frame2\"): "+p.switchToChildFrame("frame2"));
|
||||
console.log("pageTitle(): " + pageTitle(p));
|
||||
console.log("currentFrameName(): "+p.currentFrameName());
|
||||
console.log("childFramesCount(): "+p.childFramesCount());
|
||||
console.log("childFramesName(): "+p.childFramesName());
|
||||
console.log("setPageTitle(CURRENT TITLE+'-visited')"); setPageTitle(p, pageTitle(p) + "-visited");
|
||||
console.log("");
|
||||
|
||||
phantom.exit();
|
||||
});
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
# Get weather info for given address (or for the default one, "Mountain View")
|
||||
|
||||
page = require('webpage').create()
|
||||
system = require 'system'
|
||||
address = 'Mountain View' #< default value
|
||||
|
||||
# Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
|
||||
page.onConsoleMessage = (msg) ->
|
||||
console.log msg
|
||||
|
||||
# Print usage message, if no address is passed
|
||||
if system.args.length < 2
|
||||
console.log 'Usage: weather.coffee [address]'
|
||||
else
|
||||
address = Array.prototype.slice.call(system.args, 1).join(' ')
|
||||
|
||||
# Heading
|
||||
console.log "*** Loading weather information for '#{address}' ***\n"
|
||||
|
||||
# Open Google "secret" Weather API and, onPageLoad, do...
|
||||
page.open encodeURI("http://www.google.com/ig/api?weather=#{address}"), (status) ->
|
||||
# Check for page load success
|
||||
if status isnt 'success'
|
||||
console.log 'Unable to access network'
|
||||
else
|
||||
# Execute some DOM inspection within the page context
|
||||
page.evaluate ->
|
||||
if document.querySelectorAll('problem_cause').length > 0
|
||||
console.log "No data available for #{address}"
|
||||
else
|
||||
data = (s, e) ->
|
||||
e = e or document
|
||||
el = e.querySelector s
|
||||
if el then el.attributes.data.value else undefined
|
||||
|
||||
console.log """City: #{data 'weather > forecast_information > city'}
|
||||
Current condition: #{data 'weather > current_conditions > condition'}
|
||||
Temperature: #{data 'weather > current_conditions > temp_f'} F
|
||||
#{data 'weather > current_conditions > humidity'}
|
||||
#{data 'weather > current_conditions > wind_condition'}\n
|
||||
"""
|
||||
|
||||
forecasts = document.querySelectorAll 'weather > forecast_conditions'
|
||||
for i in forecasts
|
||||
console.log "#{ data 'day_of_week', i }: " +
|
||||
"#{ data 'low', i }-" +
|
||||
"#{ data 'high', i } F " +
|
||||
"#{ data 'condition', i }"
|
||||
phantom.exit()
|
|
@ -1,37 +1,58 @@
|
|||
// Get weather info for given address (or for the default one, "Mountain View")
|
||||
|
||||
var page = require('webpage').create(),
|
||||
system = require('system'),
|
||||
city,
|
||||
url;
|
||||
address = "Mountain View"; //< default value
|
||||
|
||||
city = 'Mountain View, California'; // default
|
||||
if (system.args.length > 1) {
|
||||
city = Array.prototype.slice.call(system.args, 1).join(' ');
|
||||
// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
|
||||
page.onConsoleMessage = function(msg) {
|
||||
console.log(msg);
|
||||
};
|
||||
|
||||
// Print usage message, if no address is passed
|
||||
if (system.args.length < 2) {
|
||||
console.log("Usage: weather.js [address]");
|
||||
} else {
|
||||
address = Array.prototype.slice.call(system.args, 1).join(' ');
|
||||
}
|
||||
url = encodeURI('http://api.openweathermap.org/data/2.1/find/name?q=' + city);
|
||||
|
||||
console.log('Checking weather condition for', city, '...');
|
||||
// Heading
|
||||
console.log("*** Loading weather information for '" + address + "' ***\n");
|
||||
|
||||
page.open(url, function(status) {
|
||||
var result, data;
|
||||
if (status !== 'success') {
|
||||
console.log('Error: Unable to access network!');
|
||||
// Open Google "secret" Weather API and, onPageLoad, do...
|
||||
page.open(encodeURI('http://www.google.com/ig/api?weather=' + address), function (status) {
|
||||
// Check for page load success
|
||||
if (status !== "success") {
|
||||
console.log("Unable to access network");
|
||||
} else {
|
||||
result = page.evaluate(function () {
|
||||
return document.body.innerText;
|
||||
});
|
||||
try {
|
||||
data = JSON.parse(result);
|
||||
data = data.list[0];
|
||||
// Execute some DOM inspection within the page context
|
||||
page.evaluate(function() {
|
||||
if (document.querySelectorAll('problem_cause').length > 0) {
|
||||
console.log('No data available for ' + address);
|
||||
} else {
|
||||
function data (s, e) {
|
||||
var el;
|
||||
e = e || document;
|
||||
el = e.querySelector(s);
|
||||
return el ? el.attributes.data.value : undefined;
|
||||
};
|
||||
|
||||
console.log('City: ' + data('weather > forecast_information > city'));
|
||||
console.log('Current condition: ' + data('weather > current_conditions > condition'));
|
||||
console.log('Temperature: ' + data('weather > current_conditions > temp_f') + ' F');
|
||||
console.log(data('weather > current_conditions > humidity'));
|
||||
console.log(data('weather > current_conditions > wind_condition'));
|
||||
console.log('');
|
||||
console.log('City:', data.name);
|
||||
console.log('Condition:', data.weather.map(function(entry) {
|
||||
return entry.main;
|
||||
}).join(', '));
|
||||
console.log('Temperature:', Math.round(data.main.temp - 273.15), 'C');
|
||||
console.log('Humidity:', Math.round(data.main.humidity), '%');
|
||||
} catch (e) {
|
||||
console.log('Error:', e.toString());
|
||||
|
||||
var forecasts = document.querySelectorAll('weather > forecast_conditions');
|
||||
for (var i = 0; i < forecasts.length; ++i) {
|
||||
var f = forecasts[i];
|
||||
console.log(data('day_of_week', f) + ': ' +
|
||||
data('low', f) + '-' + data('high', f) + ' F ' +
|
||||
data('condition', f));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
phantom.exit();
|
||||
});
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
TEMPLATE = subdirs
|
||||
CONFIG += ordered
|
||||
SUBDIRS += src/qphantom/phantom.pro src/phantomjs.pro
|
||||
SUBDIRS += src/phantomjs.pro
|
||||
|
|
24
rpm/mkrpm.sh
24
rpm/mkrpm.sh
|
@ -1,24 +0,0 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# A silly little helper script to build the RPM.
|
||||
set -e
|
||||
|
||||
name=${1:?"Usage: build <toolname>"}
|
||||
name=${name%.spec}
|
||||
topdir=$(mktemp -d)
|
||||
version=$(awk '/define version/ { print $NF }' ${name}.spec)
|
||||
builddir=${TMPDIR:-/tmp}/${name}-${version}
|
||||
sourcedir="${topdir}/SOURCES"
|
||||
buildroot="${topdir}/BUILD/${name}-${version}-root"
|
||||
mkdir -p ${topdir}/RPMS ${topdir}/SRPMS ${topdir}/SOURCES ${topdir}/BUILD
|
||||
mkdir -p ${buildroot} ${builddir}
|
||||
echo "=> Copying sources..."
|
||||
( cd .. && tar cf - ./[A-Z]* ./bin ./examples | tar xf - -C ${builddir} )
|
||||
echo "=> Creating source tarball under ${sourcedir}..."
|
||||
( cd ${builddir}/.. && tar zcf ${sourcedir}/${name}-${version}.tar.gz ${name}-${version} )
|
||||
echo "=> Building RPM..."
|
||||
rpm=$(rpmbuild --define "_topdir ${topdir}" --buildroot ${buildroot} --clean -bb ${name}.spec 2>/dev/null | \
|
||||
awk '/\/RPMS\// { print $2; }')
|
||||
cp ${rpm} ${TMPDIR:-/tmp}/
|
||||
rm -fr ${topdir}
|
||||
echo ${TMPDIR:-/tmp}/${rpm##*/}
|
|
@ -1,163 +0,0 @@
|
|||
%define name phantomjs
|
||||
%define version 1.9
|
||||
%define release 1
|
||||
%define prefix /usr
|
||||
|
||||
%define mybuilddir %{_builddir}/%{name}-%{version}-root
|
||||
|
||||
Summary: a headless WebKit with JavaScript API
|
||||
Name: %{name}
|
||||
Version: %{version}
|
||||
License: BSD
|
||||
Release: %{release}
|
||||
Packager: Matthew Barr <mbarr@snap-interactive.com>
|
||||
Group: Utilities/Misc
|
||||
Source: %{name}-%{version}.tar.gz
|
||||
BuildRoot: /tmp/%{name}-%{version}-root
|
||||
|
||||
%description
|
||||
PhantomJS is a headless WebKit with JavaScript API. It has fast and native
|
||||
support for various web standards: DOM handling, CSS selector, JSON,
|
||||
Canvas, and SVG. PhantomJS is created by Ariya Hidayat.
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
|
||||
%install
|
||||
mkdir -p %{mybuilddir}%{prefix}/bin
|
||||
mkdir -p %{mybuilddir}%{prefix}/share/%{name}/examples
|
||||
cp bin/%{name} %{mybuilddir}%{prefix}/bin/%{name}
|
||||
cp examples/* %{mybuilddir}%{prefix}/share/%{name}/examples/
|
||||
cp CONTRIBUTING.md %{mybuilddir}%{prefix}/share/%{name}/
|
||||
cp ChangeLog %{mybuilddir}%{prefix}/share/%{name}/
|
||||
cp LICENSE.BSD %{mybuilddir}%{prefix}/share/%{name}/
|
||||
cp README.md %{mybuilddir}%{prefix}/share/%{name}/
|
||||
|
||||
%files
|
||||
%defattr(0444,root,root)
|
||||
%attr(0555,root,root)%{prefix}/bin/%{name}
|
||||
%{prefix}/share/%{name}/ChangeLog
|
||||
%{prefix}/share/%{name}/CONTRIBUTING.md
|
||||
%{prefix}/share/%{name}/examples/arguments.coffee
|
||||
%{prefix}/share/%{name}/examples/arguments.js
|
||||
%{prefix}/share/%{name}/examples/child_process-examples.coffee
|
||||
%{prefix}/share/%{name}/examples/child_process-examples.js
|
||||
%{prefix}/share/%{name}/examples/colorwheel.coffee
|
||||
%{prefix}/share/%{name}/examples/colorwheel.js
|
||||
%{prefix}/share/%{name}/examples/countdown.coffee
|
||||
%{prefix}/share/%{name}/examples/countdown.js
|
||||
%{prefix}/share/%{name}/examples/detectsniff.coffee
|
||||
%{prefix}/share/%{name}/examples/detectsniff.js
|
||||
%{prefix}/share/%{name}/examples/direction.coffee
|
||||
%{prefix}/share/%{name}/examples/direction.js
|
||||
%{prefix}/share/%{name}/examples/echoToFile.coffee
|
||||
%{prefix}/share/%{name}/examples/echoToFile.js
|
||||
%{prefix}/share/%{name}/examples/features.coffee
|
||||
%{prefix}/share/%{name}/examples/features.js
|
||||
%{prefix}/share/%{name}/examples/fibo.coffee
|
||||
%{prefix}/share/%{name}/examples/fibo.js
|
||||
%{prefix}/share/%{name}/examples/follow.coffee
|
||||
%{prefix}/share/%{name}/examples/follow.js
|
||||
%{prefix}/share/%{name}/examples/hello.coffee
|
||||
%{prefix}/share/%{name}/examples/hello.js
|
||||
%{prefix}/share/%{name}/examples/imagebin.coffee
|
||||
%{prefix}/share/%{name}/examples/imagebin.js
|
||||
%{prefix}/share/%{name}/examples/injectme.coffee
|
||||
%{prefix}/share/%{name}/examples/injectme.js
|
||||
%{prefix}/share/%{name}/examples/ipgeocode.coffee
|
||||
%{prefix}/share/%{name}/examples/ipgeocode.js
|
||||
%{prefix}/share/%{name}/examples/loadspeed.coffee
|
||||
%{prefix}/share/%{name}/examples/loadspeed.js
|
||||
%{prefix}/share/%{name}/examples/loadurlwithoutcss.coffee
|
||||
%{prefix}/share/%{name}/examples/loadurlwithoutcss.js
|
||||
%{prefix}/share/%{name}/examples/modernizr.js
|
||||
%{prefix}/share/%{name}/examples/module.coffee
|
||||
%{prefix}/share/%{name}/examples/module.js
|
||||
%{prefix}/share/%{name}/examples/movies.coffee
|
||||
%{prefix}/share/%{name}/examples/movies.js
|
||||
%{prefix}/share/%{name}/examples/netlog.coffee
|
||||
%{prefix}/share/%{name}/examples/netlog.js
|
||||
%{prefix}/share/%{name}/examples/netsniff.coffee
|
||||
%{prefix}/share/%{name}/examples/netsniff.js
|
||||
%{prefix}/share/%{name}/examples/openurlwithproxy.coffee
|
||||
%{prefix}/share/%{name}/examples/openurlwithproxy.js
|
||||
%{prefix}/share/%{name}/examples/outputEncoding.coffee
|
||||
%{prefix}/share/%{name}/examples/outputEncoding.js
|
||||
%{prefix}/share/%{name}/examples/page_events.coffee
|
||||
%{prefix}/share/%{name}/examples/page_events.js
|
||||
%{prefix}/share/%{name}/examples/pagecallback.coffee
|
||||
%{prefix}/share/%{name}/examples/pagecallback.js
|
||||
%{prefix}/share/%{name}/examples/phantomwebintro.coffee
|
||||
%{prefix}/share/%{name}/examples/phantomwebintro.js
|
||||
%{prefix}/share/%{name}/examples/pizza.coffee
|
||||
%{prefix}/share/%{name}/examples/pizza.js
|
||||
%{prefix}/share/%{name}/examples/post.coffee
|
||||
%{prefix}/share/%{name}/examples/post.js
|
||||
%{prefix}/share/%{name}/examples/postjson.coffee
|
||||
%{prefix}/share/%{name}/examples/postjson.js
|
||||
%{prefix}/share/%{name}/examples/postserver.coffee
|
||||
%{prefix}/share/%{name}/examples/postserver.js
|
||||
%{prefix}/share/%{name}/examples/printenv.coffee
|
||||
%{prefix}/share/%{name}/examples/printenv.js
|
||||
%{prefix}/share/%{name}/examples/printheaderfooter.coffee
|
||||
%{prefix}/share/%{name}/examples/printheaderfooter.js
|
||||
%{prefix}/share/%{name}/examples/printmargins.coffee
|
||||
%{prefix}/share/%{name}/examples/printmargins.js
|
||||
%{prefix}/share/%{name}/examples/rasterize.coffee
|
||||
%{prefix}/share/%{name}/examples/rasterize.js
|
||||
%{prefix}/share/%{name}/examples/render_multi_url.coffee
|
||||
%{prefix}/share/%{name}/examples/render_multi_url.js
|
||||
%{prefix}/share/%{name}/examples/run-jasmine.coffee
|
||||
%{prefix}/share/%{name}/examples/run-jasmine.js
|
||||
%{prefix}/share/%{name}/examples/run-jasmine2.js
|
||||
%{prefix}/share/%{name}/examples/run-qunit.coffee
|
||||
%{prefix}/share/%{name}/examples/run-qunit.js
|
||||
%{prefix}/share/%{name}/examples/scandir.coffee
|
||||
%{prefix}/share/%{name}/examples/scandir.js
|
||||
%{prefix}/share/%{name}/examples/seasonfood.coffee
|
||||
%{prefix}/share/%{name}/examples/seasonfood.js
|
||||
%{prefix}/share/%{name}/examples/server.coffee
|
||||
%{prefix}/share/%{name}/examples/server.js
|
||||
%{prefix}/share/%{name}/examples/serverkeepalive.coffee
|
||||
%{prefix}/share/%{name}/examples/serverkeepalive.js
|
||||
%{prefix}/share/%{name}/examples/simpleserver.coffee
|
||||
%{prefix}/share/%{name}/examples/simpleserver.js
|
||||
%{prefix}/share/%{name}/examples/sleepsort.coffee
|
||||
%{prefix}/share/%{name}/examples/sleepsort.js
|
||||
%{prefix}/share/%{name}/examples/stdin-stdout-stderr.coffee
|
||||
%{prefix}/share/%{name}/examples/stdin-stdout-stderr.js
|
||||
%{prefix}/share/%{name}/examples/technews.coffee
|
||||
%{prefix}/share/%{name}/examples/technews.js
|
||||
%{prefix}/share/%{name}/examples/tweets.coffee
|
||||
%{prefix}/share/%{name}/examples/tweets.js
|
||||
%{prefix}/share/%{name}/examples/universe.js
|
||||
%{prefix}/share/%{name}/examples/unrandomize.coffee
|
||||
%{prefix}/share/%{name}/examples/unrandomize.js
|
||||
%{prefix}/share/%{name}/examples/useragent.coffee
|
||||
%{prefix}/share/%{name}/examples/useragent.js
|
||||
%{prefix}/share/%{name}/examples/version.coffee
|
||||
%{prefix}/share/%{name}/examples/version.js
|
||||
%{prefix}/share/%{name}/examples/waitfor.coffee
|
||||
%{prefix}/share/%{name}/examples/waitfor.js
|
||||
%{prefix}/share/%{name}/examples/walk_through_frames.coffee
|
||||
%{prefix}/share/%{name}/examples/walk_through_frames.js
|
||||
%{prefix}/share/%{name}/examples/weather.coffee
|
||||
%{prefix}/share/%{name}/examples/weather.js
|
||||
%{prefix}/share/%{name}/LICENSE.BSD
|
||||
%{prefix}/share/%{name}/README.md
|
||||
|
||||
%changelog
|
||||
* Fri Apr 18 2014 Eric Heydenberk <heydenberk@gmail.com>
|
||||
- add missing filenames for examples to files section
|
||||
|
||||
* Tue Apr 30 2013 Eric Heydenberk <heydenberk@gmail.com>
|
||||
- add missing filenames for examples to files section
|
||||
|
||||
* Wed Apr 24 2013 Robin Helgelin <lobbin@gmail.com>
|
||||
- updated to version 1.9
|
||||
|
||||
* Thu Jan 24 2013 Matthew Barr <mbarr@snap-interactive.com>
|
||||
- updated to version 1.8
|
||||
|
||||
* Thu Nov 15 2012 Jan Schaumann <jschauma@etsy.com>
|
||||
- first rpm version
|
|
@ -1,18 +0,0 @@
|
|||
/src/client/linux/linux_dumper_unittest_helper
|
||||
/src/processor/minidump_dump
|
||||
/src/processor/minidump_stackwalk
|
||||
/src/tools/linux/core2md/core2md
|
||||
/src/tools/linux/dump_syms/dump_syms
|
||||
/src/tools/linux/md2core/minidump-2-core
|
||||
/src/tools/linux/symupload/minidump_upload
|
||||
/src/tools/linux/symupload/sym_upload
|
||||
/src/config.h
|
||||
/src/stamp-h1
|
||||
/config.log
|
||||
/config.status
|
||||
/autom4te.cache
|
||||
!Makefile.am
|
||||
!Makefile.in
|
||||
|
||||
.dirstamp
|
||||
.deps
|
311
src/bootstrap.js
311
src/bootstrap.js
|
@ -8,7 +8,6 @@
|
|||
Copyright (C) 2011 Ivan De Marino <ivan.de.marino@gmail.com>
|
||||
Copyright (C) 2011 James Roe <roejames12@hotmail.com>
|
||||
Copyright (C) 2011 execjosh, http://execjosh.blogspot.com
|
||||
Copyright (C) 2012 James M. Greene <james.m.greene@gmail.com>
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
@ -34,294 +33,56 @@
|
|||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
phantom.__defineErrorSignalHandler__ = function(obj, page, handlers) {
|
||||
var handlerName = 'onError';
|
||||
function require(name) {
|
||||
var code, func, exports;
|
||||
|
||||
Object.defineProperty(obj, handlerName, {
|
||||
set: function (f) {
|
||||
// Disconnect previous handler (if any)
|
||||
var handlerObj = handlers[handlerName];
|
||||
if (!!handlerObj && typeof handlerObj.callback === "function" && typeof handlerObj.connector === "function") {
|
||||
try { page.javaScriptErrorSent.disconnect(handlerObj.connector); }
|
||||
catch (e) { }
|
||||
if (name === 'webpage' || name === 'fs' || name === 'webserver' || name === 'system') {
|
||||
code = phantom.loadModuleSource(name);
|
||||
func = new Function("exports", "window", code);
|
||||
exports = {};
|
||||
if (name === 'fs') {
|
||||
exports = phantom.createFilesystem();
|
||||
} else if (name === 'system') {
|
||||
exports = phantom.createSystem();
|
||||
}
|
||||
func.call({}, exports, {});
|
||||
return exports;
|
||||
}
|
||||
|
||||
// Delete the previous handler
|
||||
delete handlers[handlerName];
|
||||
|
||||
if (typeof f === 'function') {
|
||||
var connector = function (message, lineNumber, source, stack) {
|
||||
var revisedStack = JSON.parse(stack).map(function (item) {
|
||||
return { file: item.url, line: item.lineNumber, function: item.functionName };
|
||||
});
|
||||
if (revisedStack.length == 0)
|
||||
revisedStack = [{ file: source, line: lineNumber }];
|
||||
|
||||
f(message, revisedStack);
|
||||
};
|
||||
// Store the new handler for reference
|
||||
handlers[handlerName] = {
|
||||
callback: f,
|
||||
connector: connector
|
||||
};
|
||||
|
||||
page.javaScriptErrorSent.connect(connector);
|
||||
if (typeof exports === 'undefined') {
|
||||
throw 'Unknown module ' + name + ' for require()';
|
||||
}
|
||||
},
|
||||
get: function () {
|
||||
var handlerObj = handlers[handlerName];
|
||||
return (!!handlerObj && typeof handlerObj.callback === "function" && typeof handlerObj.connector === "function") ?
|
||||
handlers[handlerName].callback :
|
||||
undefined;
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
(function() {
|
||||
var handlers = {};
|
||||
phantom.__defineErrorSignalHandler__(phantom, phantom.page, handlers);
|
||||
var handler;
|
||||
var signal = phantom.page.javaScriptErrorSent;
|
||||
|
||||
phantom.__defineSetter__('onError', function(f) {
|
||||
if (handler && typeof handler === 'function') {
|
||||
try { signal.disconnect(handler) } catch (e) {}
|
||||
}
|
||||
|
||||
handler = f;
|
||||
|
||||
if (typeof f === 'function') {
|
||||
signal.connect(f);
|
||||
}
|
||||
})
|
||||
})();
|
||||
|
||||
// TODO: Make this output to STDERR
|
||||
phantom.defaultErrorHandler = function(message, stack) {
|
||||
console.log(message + "\n");
|
||||
phantom.defaultErrorHandler = function(error, backtrace) {
|
||||
console.log(error + "\n");
|
||||
|
||||
stack.forEach(function(item) {
|
||||
backtrace.forEach(function(item) {
|
||||
var message = item.file + ":" + item.line;
|
||||
if (item["function"])
|
||||
message += " in " + item["function"];
|
||||
if (item.function) message += " in " + item.function
|
||||
console.log(" " + message);
|
||||
});
|
||||
};
|
||||
})
|
||||
}
|
||||
|
||||
phantom.onError = phantom.defaultErrorHandler;
|
||||
|
||||
phantom.callback = function(callback) {
|
||||
var ret = phantom.createCallback();
|
||||
ret.called.connect(function(args) {
|
||||
var retVal = callback.apply(this, args);
|
||||
ret.returnValue = retVal;
|
||||
});
|
||||
return ret;
|
||||
};
|
||||
|
||||
(function() {
|
||||
// CommonJS module implementation follows
|
||||
|
||||
window.global = window;
|
||||
// fs is loaded at the end, when everything is ready
|
||||
var fs;
|
||||
var cache = {};
|
||||
var paths = [];
|
||||
// use getters to initialize lazily
|
||||
// (for future, now both fs and system are loaded anyway)
|
||||
var nativeExports = {
|
||||
get fs() { return phantom.createFilesystem(); },
|
||||
get child_process() { return phantom._createChildProcess(); },
|
||||
get system() { return phantom.createSystem(); }
|
||||
};
|
||||
var extensions = {
|
||||
'.js': function(module, filename) {
|
||||
var code = fs.read(filename);
|
||||
module._compile(code);
|
||||
},
|
||||
|
||||
'.json': function(module, filename) {
|
||||
module.exports = JSON.parse(fs.read(filename));
|
||||
}
|
||||
};
|
||||
|
||||
function loadFs() {
|
||||
var file, code, module, filename = ':/modules/fs.js';
|
||||
|
||||
module = new Module(filename);
|
||||
cache[filename] = module;
|
||||
module.exports = nativeExports.fs;
|
||||
|
||||
file = module.exports._open(filename, { mode: 'r' })
|
||||
code = file.read();
|
||||
file.close();
|
||||
module._compile(code);
|
||||
|
||||
return module.exports;
|
||||
}
|
||||
|
||||
function dirname(path) {
|
||||
var replaced = path.replace(/\/[^\/]*\/?$/, '');
|
||||
if (replaced == path) {
|
||||
replaced = '';
|
||||
}
|
||||
return replaced;
|
||||
}
|
||||
|
||||
function basename(path) {
|
||||
return path.replace(/.*\//, '');
|
||||
}
|
||||
|
||||
function joinPath() {
|
||||
// It should be okay to hard-code a slash here.
|
||||
// The FileSystem module returns a platform-specific
|
||||
// separator, but the JavaScript engine only expects
|
||||
// the slash.
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
return args.join('/');
|
||||
}
|
||||
|
||||
function tryFile(path) {
|
||||
if (fs.isFile(path)) return path;
|
||||
return null;
|
||||
}
|
||||
|
||||
function tryExtensions(path) {
|
||||
var filename, exts = Object.keys(extensions);
|
||||
for (var i=0; i<exts.length; ++i) {
|
||||
filename = tryFile(path + exts[i]);
|
||||
if (filename) return filename;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function tryPackage(path) {
|
||||
var filename, package, packageFile = joinPath(path, 'package.json');
|
||||
if (fs.isFile(packageFile)) {
|
||||
package = JSON.parse(fs.read(packageFile));
|
||||
if (!package || !package.main) return null;
|
||||
|
||||
filename = fs.absolute(joinPath(path, package.main));
|
||||
|
||||
return tryFile(filename) || tryExtensions(filename) ||
|
||||
tryExtensions(joinPath(filename, 'index'));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function Module(filename, stubs) {
|
||||
if (filename) this._setFilename(filename);
|
||||
this.exports = {};
|
||||
this.stubs = {};
|
||||
for (var name in stubs) {
|
||||
this.stubs[name] = stubs[name];
|
||||
}
|
||||
}
|
||||
|
||||
Module.prototype._setFilename = function(filename) {
|
||||
this.id = this.filename = filename;
|
||||
this.dirname = dirname(filename);
|
||||
};
|
||||
|
||||
Module.prototype._isNative = function() {
|
||||
return this.filename && this.filename[0] === ':';
|
||||
};
|
||||
|
||||
Module.prototype._getPaths = function(request) {
|
||||
var _paths = [], dir;
|
||||
|
||||
if (request[0] === '.') {
|
||||
_paths.push(fs.absolute(joinPath(phantom.webdriverMode ? ":/ghostdriver" : this.dirname, request)));
|
||||
} else if (fs.isAbsolute(request)) {
|
||||
_paths.push(fs.absolute(request));
|
||||
} else {
|
||||
// first look in PhantomJS modules
|
||||
_paths.push(joinPath(':/modules', request));
|
||||
// then look in node_modules directories
|
||||
if (!this._isNative()) {
|
||||
dir = this.dirname;
|
||||
while (dir) {
|
||||
_paths.push(joinPath(dir, 'node_modules', request));
|
||||
dir = dirname(dir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (var i=0; i<paths.length; ++i) {
|
||||
if(fs.isAbsolute(paths[i])) {
|
||||
_paths.push(fs.absolute(joinPath(paths[i], request)));
|
||||
} else {
|
||||
_paths.push(fs.absolute(joinPath(this.dirname, paths[i], request)));
|
||||
}
|
||||
}
|
||||
|
||||
return _paths;
|
||||
};
|
||||
|
||||
Module.prototype._getFilename = function(request) {
|
||||
var path, filename = null, _paths = this._getPaths(request);
|
||||
|
||||
for (var i=0; i<_paths.length && !filename; ++i) {
|
||||
path = _paths[i];
|
||||
filename = tryFile(path) || tryExtensions(path) || tryPackage(path) ||
|
||||
tryExtensions(joinPath(path, 'index'));
|
||||
}
|
||||
|
||||
return filename;
|
||||
};
|
||||
|
||||
Module.prototype._getRequire = function() {
|
||||
var self = this;
|
||||
|
||||
function require(request) {
|
||||
return self.require(request);
|
||||
}
|
||||
require.cache = cache;
|
||||
require.extensions = extensions;
|
||||
require.paths = paths;
|
||||
require.stub = function(request, exports) {
|
||||
self.stubs[request] = { exports: exports };
|
||||
};
|
||||
|
||||
return require;
|
||||
};
|
||||
|
||||
Module.prototype._load = function() {
|
||||
var ext = this.filename.match(/\.[^.]+$/)[0];
|
||||
if (!ext) ext = '.js';
|
||||
extensions[ext](this, this.filename);
|
||||
};
|
||||
|
||||
Module.prototype._compile = function(code) {
|
||||
phantom.loadModule(code, this.filename);
|
||||
};
|
||||
|
||||
Module.prototype.require = function(request) {
|
||||
var filename, module;
|
||||
|
||||
// first see if there are any stubs for the request
|
||||
if (this.stubs.hasOwnProperty(request)) {
|
||||
if (this.stubs[request].exports instanceof Function) {
|
||||
this.stubs[request].exports = this.stubs[request].exports();
|
||||
}
|
||||
return this.stubs[request].exports;
|
||||
}
|
||||
|
||||
// else look for a file
|
||||
filename = this._getFilename(request);
|
||||
if (!filename) {
|
||||
throw new Error("Cannot find module '" + request + "'");
|
||||
}
|
||||
|
||||
if (cache.hasOwnProperty(filename)) {
|
||||
return cache[filename].exports;
|
||||
}
|
||||
|
||||
module = new Module(filename, this.stubs);
|
||||
if (module._isNative()) {
|
||||
module.exports = nativeExports[request] || {};
|
||||
}
|
||||
cache[filename] = module;
|
||||
module._load();
|
||||
|
||||
return module.exports;
|
||||
};
|
||||
|
||||
(function() {
|
||||
var cwd, mainFilename, mainModule = new Module();
|
||||
window.require = mainModule._getRequire();
|
||||
fs = loadFs();
|
||||
cwd = fs.absolute(phantom.libraryPath);
|
||||
mainFilename = joinPath(cwd, basename(require('system').args[0]) || 'repl');
|
||||
mainModule._setFilename(mainFilename);
|
||||
}());
|
||||
}());
|
||||
|
||||
// Legacy way to use WebPage
|
||||
window.WebPage = require('webpage').create;
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
/src/client/linux/linux_dumper_unittest_helper
|
||||
/src/processor/minidump_dump
|
||||
/src/processor/minidump_stackwalk
|
||||
/src/tools/linux/core2md/core2md
|
||||
/src/tools/linux/dump_syms/dump_syms
|
||||
/src/tools/linux/md2core/minidump-2-core
|
||||
/src/tools/linux/symupload/minidump_upload
|
||||
/src/tools/linux/symupload/sym_upload
|
||||
/src/config.h
|
||||
/src/stamp-h1
|
||||
/config.log
|
||||
/config.status
|
||||
/autom4te.cache
|
||||
!Makefile.am
|
||||
!Makefile.in
|
||||
|
||||
.dirstamp
|
||||
.deps
|
|
@ -1 +0,0 @@
|
|||
opensource@google.com
|
|
@ -1,28 +0,0 @@
|
|||
Copyright (c) 2006, Google Inc.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Google Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -1,44 +0,0 @@
|
|||
# Copyright (c) 2010, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# We only use this file to ease the steps of generating projects after
|
||||
# syncing, if we use gclient. All dependencies are svn:externals instead.
|
||||
# If you're not using gclient, you need to run the gyp python script to
|
||||
# generate the projects.
|
||||
# This can be done by the following command (assuming current directory):
|
||||
# src\tools\gyp\gyp.bat src\client\windows\breakpad_client.gyp
|
||||
hooks = [
|
||||
{
|
||||
# A change to a .gyp, .gypi, or to GYP itself should run the generator.
|
||||
"pattern": ".",
|
||||
"action": ["python",
|
||||
"src/src/tools/gyp/gyp",
|
||||
"src/src/client/windows/breakpad_client.gyp"],
|
||||
},
|
||||
]
|
|
@ -1,234 +0,0 @@
|
|||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
|
||||
2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is free documentation; the Free Software Foundation gives
|
||||
unlimited permission to copy, distribute and modify it.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation.
|
||||
|
||||
5. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that the
|
||||
`configure' script does not know about. Run `./configure --help' for
|
||||
details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX'.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them.
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out automatically,
|
||||
but needs to determine by the type of machine the package will run on.
|
||||
Usually, assuming the package is built to be run on the _same_
|
||||
architectures, `configure' can figure that out, but if it prints a
|
||||
message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share, you
|
||||
can create a site shell script called `config.site' that gives default
|
||||
values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf bug. Until the bug is fixed you can use this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of the options to `configure', and exit.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
|
@ -1,990 +0,0 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
# Copyright (c) 2011, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
# This allows #includes to be relative to src/
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src
|
||||
|
||||
# Specify include paths for ac macros
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
## Documentation
|
||||
docdir = $(prefix)/share/doc/$(PACKAGE)-$(VERSION)
|
||||
|
||||
dist_doc_DATA = \
|
||||
AUTHORS \
|
||||
COPYING \
|
||||
ChangeLog \
|
||||
INSTALL \
|
||||
NEWS \
|
||||
README
|
||||
|
||||
|
||||
## Libraries
|
||||
noinst_LIBRARIES =
|
||||
lib_LIBRARIES =
|
||||
bin_PROGRAMS =
|
||||
check_PROGRAMS =
|
||||
|
||||
if !DISABLE_PROCESSOR
|
||||
lib_LIBRARIES += src/libbreakpad.a
|
||||
noinst_LIBRARIES += src/third_party/libdisasm/libdisasm.a
|
||||
endif
|
||||
|
||||
if LINUX_HOST
|
||||
lib_LIBRARIES += src/client/linux/libbreakpad_client.a
|
||||
|
||||
src_client_linux_libbreakpad_client_a_SOURCES = \
|
||||
src/client/linux/crash_generation/crash_generation_client.cc \
|
||||
src/client/linux/handler/exception_handler.cc \
|
||||
src/client/linux/log/log.cc \
|
||||
src/client/linux/minidump_writer/linux_dumper.cc \
|
||||
src/client/linux/minidump_writer/linux_ptrace_dumper.cc \
|
||||
src/client/linux/minidump_writer/minidump_writer.cc \
|
||||
src/client/minidump_file_writer.cc \
|
||||
src/common/convert_UTF.c \
|
||||
src/common/md5.cc \
|
||||
src/common/string_conversion.cc \
|
||||
src/common/linux/file_id.cc \
|
||||
src/common/linux/guid_creator.cc \
|
||||
src/common/linux/memory_mapped_file.cc \
|
||||
src/common/linux/safe_readlink.cc
|
||||
endif LINUX_HOST
|
||||
|
||||
if !DISABLE_PROCESSOR
|
||||
src_libbreakpad_a_SOURCES = \
|
||||
src/google_breakpad/common/breakpad_types.h \
|
||||
src/google_breakpad/common/minidump_format.h \
|
||||
src/google_breakpad/common/minidump_size.h \
|
||||
src/google_breakpad/processor/basic_source_line_resolver.h \
|
||||
src/google_breakpad/processor/call_stack.h \
|
||||
src/google_breakpad/processor/code_module.h \
|
||||
src/google_breakpad/processor/code_modules.h \
|
||||
src/google_breakpad/processor/exploitability.h \
|
||||
src/google_breakpad/processor/fast_source_line_resolver.h \
|
||||
src/google_breakpad/processor/memory_region.h \
|
||||
src/google_breakpad/processor/minidump.h \
|
||||
src/google_breakpad/processor/minidump_processor.h \
|
||||
src/google_breakpad/processor/process_state.h \
|
||||
src/google_breakpad/processor/source_line_resolver_base.h \
|
||||
src/google_breakpad/processor/source_line_resolver_interface.h \
|
||||
src/google_breakpad/processor/stack_frame.h \
|
||||
src/google_breakpad/processor/stack_frame_cpu.h \
|
||||
src/google_breakpad/processor/stackwalker.h \
|
||||
src/google_breakpad/processor/symbol_supplier.h \
|
||||
src/google_breakpad/processor/system_info.h \
|
||||
src/processor/address_map-inl.h \
|
||||
src/processor/address_map.h \
|
||||
src/processor/basic_code_module.h \
|
||||
src/processor/basic_code_modules.cc \
|
||||
src/processor/basic_code_modules.h \
|
||||
src/processor/basic_source_line_resolver_types.h \
|
||||
src/processor/basic_source_line_resolver.cc \
|
||||
src/processor/binarystream.h \
|
||||
src/processor/binarystream.cc \
|
||||
src/processor/call_stack.cc \
|
||||
src/processor/cfi_frame_info.cc \
|
||||
src/processor/cfi_frame_info.h \
|
||||
src/processor/contained_range_map-inl.h \
|
||||
src/processor/contained_range_map.h \
|
||||
src/processor/disassembler_x86.h \
|
||||
src/processor/disassembler_x86.cc \
|
||||
src/processor/exploitability.cc \
|
||||
src/processor/exploitability_win.h \
|
||||
src/processor/exploitability_win.cc \
|
||||
src/processor/fast_source_line_resolver_types.h \
|
||||
src/processor/fast_source_line_resolver.cc \
|
||||
src/processor/linked_ptr.h \
|
||||
src/processor/logging.h \
|
||||
src/processor/logging.cc \
|
||||
src/processor/map_serializers-inl.h \
|
||||
src/processor/map_serializers.h \
|
||||
src/processor/minidump.cc \
|
||||
src/processor/minidump_processor.cc \
|
||||
src/processor/module_comparer.cc \
|
||||
src/processor/module_comparer.h \
|
||||
src/processor/module_factory.h \
|
||||
src/processor/module_serializer.cc \
|
||||
src/processor/module_serializer.h \
|
||||
src/processor/pathname_stripper.cc \
|
||||
src/processor/pathname_stripper.h \
|
||||
src/processor/postfix_evaluator-inl.h \
|
||||
src/processor/postfix_evaluator.h \
|
||||
src/processor/process_state.cc \
|
||||
src/processor/range_map-inl.h \
|
||||
src/processor/range_map.h \
|
||||
src/processor/scoped_ptr.h \
|
||||
src/processor/simple_serializer-inl.h \
|
||||
src/processor/simple_serializer.h \
|
||||
src/processor/simple_symbol_supplier.cc \
|
||||
src/processor/simple_symbol_supplier.h \
|
||||
src/processor/windows_frame_info.h \
|
||||
src/processor/source_line_resolver_base_types.h \
|
||||
src/processor/source_line_resolver_base.cc \
|
||||
src/processor/stackwalker.cc \
|
||||
src/processor/stackwalker_amd64.cc \
|
||||
src/processor/stackwalker_amd64.h \
|
||||
src/processor/stackwalker_arm.cc \
|
||||
src/processor/stackwalker_arm.h \
|
||||
src/processor/stackwalker_ppc.cc \
|
||||
src/processor/stackwalker_ppc.h \
|
||||
src/processor/stackwalker_sparc.cc \
|
||||
src/processor/stackwalker_sparc.h \
|
||||
src/processor/stackwalker_x86.cc \
|
||||
src/processor/stackwalker_x86.h \
|
||||
src/processor/static_address_map-inl.h \
|
||||
src/processor/static_address_map.h \
|
||||
src/processor/static_contained_range_map-inl.h \
|
||||
src/processor/static_contained_range_map.h \
|
||||
src/processor/static_map_iterator-inl.h \
|
||||
src/processor/static_map_iterator.h \
|
||||
src/processor/static_map-inl.h \
|
||||
src/processor/static_map.h \
|
||||
src/processor/static_range_map-inl.h \
|
||||
src/processor/static_range_map.h \
|
||||
src/processor/tokenize.cc \
|
||||
src/processor/tokenize.h
|
||||
|
||||
src_libbreakpad_a_LIBADD = src/third_party/libdisasm/libdisasm.a
|
||||
|
||||
src_third_party_libdisasm_libdisasm_a_SOURCES = \
|
||||
src/third_party/libdisasm/ia32_implicit.c \
|
||||
src/third_party/libdisasm/ia32_implicit.h \
|
||||
src/third_party/libdisasm/ia32_insn.c \
|
||||
src/third_party/libdisasm/ia32_insn.h \
|
||||
src/third_party/libdisasm/ia32_invariant.c \
|
||||
src/third_party/libdisasm/ia32_invariant.h \
|
||||
src/third_party/libdisasm/ia32_modrm.c \
|
||||
src/third_party/libdisasm/ia32_modrm.h \
|
||||
src/third_party/libdisasm/ia32_opcode_tables.c \
|
||||
src/third_party/libdisasm/ia32_opcode_tables.h \
|
||||
src/third_party/libdisasm/ia32_operand.c \
|
||||
src/third_party/libdisasm/ia32_operand.h \
|
||||
src/third_party/libdisasm/ia32_reg.c \
|
||||
src/third_party/libdisasm/ia32_reg.h \
|
||||
src/third_party/libdisasm/ia32_settings.c \
|
||||
src/third_party/libdisasm/ia32_settings.h \
|
||||
src/third_party/libdisasm/libdis.h \
|
||||
src/third_party/libdisasm/qword.h \
|
||||
src/third_party/libdisasm/x86_disasm.c \
|
||||
src/third_party/libdisasm/x86_format.c \
|
||||
src/third_party/libdisasm/x86_imm.c \
|
||||
src/third_party/libdisasm/x86_imm.h \
|
||||
src/third_party/libdisasm/x86_insn.c \
|
||||
src/third_party/libdisasm/x86_misc.c \
|
||||
src/third_party/libdisasm/x86_operand_list.c \
|
||||
src/third_party/libdisasm/x86_operand_list.h
|
||||
|
||||
## Programs
|
||||
bin_PROGRAMS += \
|
||||
src/processor/minidump_dump \
|
||||
src/processor/minidump_stackwalk
|
||||
endif !DISABLE_PROCESSOR
|
||||
|
||||
if LINUX_HOST
|
||||
bin_PROGRAMS += \
|
||||
src/client/linux/linux_dumper_unittest_helper
|
||||
|
||||
if !DISABLE_TOOLS
|
||||
bin_PROGRAMS += \
|
||||
src/tools/linux/core2md/core2md \
|
||||
src/tools/linux/dump_syms/dump_syms \
|
||||
src/tools/linux/md2core/minidump-2-core \
|
||||
src/tools/linux/symupload/minidump_upload \
|
||||
src/tools/linux/symupload/sym_upload
|
||||
endif
|
||||
endif LINUX_HOST
|
||||
|
||||
|
||||
## Tests
|
||||
if !DISABLE_PROCESSOR
|
||||
check_PROGRAMS += \
|
||||
src/common/test_assembler_unittest \
|
||||
src/processor/address_map_unittest \
|
||||
src/processor/binarystream_unittest \
|
||||
src/processor/basic_source_line_resolver_unittest \
|
||||
src/processor/cfi_frame_info_unittest \
|
||||
src/processor/contained_range_map_unittest \
|
||||
src/processor/disassembler_x86_unittest \
|
||||
src/processor/exploitability_unittest \
|
||||
src/processor/fast_source_line_resolver_unittest \
|
||||
src/processor/map_serializers_unittest \
|
||||
src/processor/minidump_processor_unittest \
|
||||
src/processor/minidump_unittest \
|
||||
src/processor/static_address_map_unittest \
|
||||
src/processor/static_contained_range_map_unittest \
|
||||
src/processor/static_map_unittest \
|
||||
src/processor/static_range_map_unittest \
|
||||
src/processor/pathname_stripper_unittest \
|
||||
src/processor/postfix_evaluator_unittest \
|
||||
src/processor/range_map_unittest \
|
||||
src/processor/stackwalker_amd64_unittest \
|
||||
src/processor/stackwalker_arm_unittest \
|
||||
src/processor/stackwalker_x86_unittest \
|
||||
src/processor/synth_minidump_unittest
|
||||
endif
|
||||
|
||||
if LINUX_HOST
|
||||
check_PROGRAMS += \
|
||||
src/client/linux/linux_client_unittest
|
||||
|
||||
if !DISABLE_TOOLS
|
||||
check_PROGRAMS += \
|
||||
src/common/dumper_unittest \
|
||||
src/tools/linux/md2core/minidump_2_core_unittest
|
||||
endif
|
||||
endif LINUX_HOST
|
||||
|
||||
if !DISABLE_PROCESSOR
|
||||
if SELFTEST
|
||||
check_PROGRAMS += \
|
||||
src/processor/stackwalker_selftest
|
||||
endif SELFTEST
|
||||
endif !DISABLE_PROCESSOR
|
||||
|
||||
if !DISABLE_PROCESSOR
|
||||
check_SCRIPTS = \
|
||||
src/processor/minidump_dump_test \
|
||||
src/processor/minidump_stackwalk_test \
|
||||
src/processor/minidump_stackwalk_machine_readable_test
|
||||
endif
|
||||
|
||||
TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
|
||||
TESTS_ENVIRONMENT =
|
||||
|
||||
if LINUX_HOST
|
||||
src_client_linux_linux_dumper_unittest_helper_SOURCES = \
|
||||
src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
|
||||
src_client_linux_linux_dumper_unittest_helper_CXXFLAGS=$(PTHREAD_CFLAGS)
|
||||
src_client_linux_linux_dumper_unittest_helper_LDFLAGS=$(PTHREAD_CFLAGS)
|
||||
src_client_linux_linux_dumper_unittest_helper_CC=$(PTHREAD_CC)
|
||||
|
||||
src_client_linux_linux_client_unittest_SOURCES = \
|
||||
src/client/linux/handler/exception_handler_unittest.cc \
|
||||
src/client/linux/minidump_writer/directory_reader_unittest.cc \
|
||||
src/client/linux/minidump_writer/line_reader_unittest.cc \
|
||||
src/client/linux/minidump_writer/linux_core_dumper_unittest.cc \
|
||||
src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc \
|
||||
src/client/linux/minidump_writer/minidump_writer_unittest.cc \
|
||||
src/common/linux/linux_libc_support_unittest.cc \
|
||||
src/common/linux/tests/crash_generator.cc \
|
||||
src/common/memory_unittest.cc \
|
||||
src/common/tests/file_utils.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc \
|
||||
src/processor/basic_code_modules.cc \
|
||||
src/processor/logging.cc \
|
||||
src/processor/minidump.cc \
|
||||
src/processor/pathname_stripper.cc
|
||||
|
||||
src_client_linux_linux_client_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_client_linux_linux_client_unittest_LDADD = \
|
||||
src/client/linux/handler/exception_handler.o \
|
||||
src/client/linux/log/log.o \
|
||||
src/client/linux/crash_generation/crash_generation_client.o \
|
||||
src/client/linux/minidump_writer/linux_dumper.o \
|
||||
src/client/linux/minidump_writer/linux_core_dumper.o \
|
||||
src/client/linux/minidump_writer/linux_ptrace_dumper.o \
|
||||
src/client/linux/minidump_writer/minidump_writer.o \
|
||||
src/client/minidump_file_writer.o \
|
||||
src/common/convert_UTF.o \
|
||||
src/common/md5.o \
|
||||
src/common/linux/elf_core_dump.o \
|
||||
src/common/linux/file_id.o \
|
||||
src/common/linux/guid_creator.o \
|
||||
src/common/linux/memory_mapped_file.o \
|
||||
src/common/linux/safe_readlink.o \
|
||||
src/common/string_conversion.o \
|
||||
$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
|
||||
|
||||
src_client_linux_linux_client_unittest_DEPENDENCIES = \
|
||||
src/client/linux/linux_dumper_unittest_helper \
|
||||
src/client/linux/libbreakpad_client.a \
|
||||
src/libbreakpad.a
|
||||
|
||||
if !DISABLE_TOOLS
|
||||
src_tools_linux_core2md_core2md_SOURCES = \
|
||||
src/tools/linux/core2md/core2md.cc \
|
||||
src/client/linux/minidump_writer/linux_core_dumper.cc \
|
||||
src/common/linux/elf_core_dump.cc
|
||||
|
||||
src_tools_linux_core2md_core2md_LDADD = \
|
||||
src/client/linux/libbreakpad_client.a
|
||||
|
||||
src_tools_linux_dump_syms_dump_syms_SOURCES = \
|
||||
src/common/dwarf_cfi_to_module.cc \
|
||||
src/common/dwarf_cu_to_module.cc \
|
||||
src/common/dwarf_line_to_module.cc \
|
||||
src/common/language.cc \
|
||||
src/common/module.cc \
|
||||
src/common/stabs_reader.cc \
|
||||
src/common/stabs_to_module.cc \
|
||||
src/common/dwarf/bytereader.cc \
|
||||
src/common/dwarf/dwarf2diehandler.cc \
|
||||
src/common/dwarf/dwarf2reader.cc \
|
||||
src/common/linux/dump_symbols.cc \
|
||||
src/common/linux/elf_symbols_to_module.cc \
|
||||
src/common/linux/file_id.cc \
|
||||
src/common/linux/memory_mapped_file.cc \
|
||||
src/common/linux/safe_readlink.cc \
|
||||
src/tools/linux/dump_syms/dump_syms.cc
|
||||
|
||||
src_tools_linux_md2core_minidump_2_core_SOURCES = \
|
||||
src/common/linux/memory_mapped_file.cc \
|
||||
src/tools/linux/md2core/minidump-2-core.cc
|
||||
|
||||
src_tools_linux_symupload_minidump_upload_SOURCES = \
|
||||
src/common/linux/http_upload.cc \
|
||||
src/tools/linux/symupload/minidump_upload.cc
|
||||
src_tools_linux_symupload_minidump_upload_LDADD = -ldl
|
||||
|
||||
src_tools_linux_symupload_sym_upload_SOURCES = \
|
||||
src/common/linux/http_upload.cc \
|
||||
src/tools/linux/symupload/sym_upload.cc
|
||||
src_tools_linux_symupload_sym_upload_LDADD = -ldl
|
||||
|
||||
src_common_dumper_unittest_SOURCES = \
|
||||
src/common/byte_cursor_unittest.cc \
|
||||
src/common/dwarf_cfi_to_module.cc \
|
||||
src/common/dwarf_cfi_to_module_unittest.cc \
|
||||
src/common/dwarf_cu_to_module.cc \
|
||||
src/common/dwarf_cu_to_module_unittest.cc \
|
||||
src/common/dwarf_line_to_module.cc \
|
||||
src/common/dwarf_line_to_module_unittest.cc \
|
||||
src/common/language.cc \
|
||||
src/common/memory_range_unittest.cc \
|
||||
src/common/module.cc \
|
||||
src/common/module_unittest.cc \
|
||||
src/common/stabs_reader.cc \
|
||||
src/common/stabs_reader_unittest.cc \
|
||||
src/common/stabs_to_module.cc \
|
||||
src/common/stabs_to_module_unittest.cc \
|
||||
src/common/test_assembler.cc \
|
||||
src/common/dwarf/bytereader.cc \
|
||||
src/common/dwarf/bytereader_unittest.cc \
|
||||
src/common/dwarf/cfi_assembler.cc \
|
||||
src/common/dwarf/dwarf2diehandler.cc \
|
||||
src/common/dwarf/dwarf2diehandler_unittest.cc \
|
||||
src/common/dwarf/dwarf2reader.cc \
|
||||
src/common/dwarf/dwarf2reader_cfi_unittest.cc \
|
||||
src/common/dwarf/dwarf2reader_die_unittest.cc \
|
||||
src/common/linux/dump_symbols.cc \
|
||||
src/common/linux/dump_symbols_unittest.cc \
|
||||
src/common/linux/elf_core_dump.cc \
|
||||
src/common/linux/elf_core_dump_unittest.cc \
|
||||
src/common/linux/elf_symbols_to_module.cc \
|
||||
src/common/linux/elf_symbols_to_module_unittest.cc \
|
||||
src/common/linux/memory_mapped_file.cc \
|
||||
src/common/linux/memory_mapped_file_unittest.cc \
|
||||
src/common/linux/synth_elf.cc \
|
||||
src/common/linux/synth_elf_unittest.cc \
|
||||
src/common/linux/file_id.cc \
|
||||
src/common/linux/file_id_unittest.cc \
|
||||
src/common/linux/safe_readlink.cc \
|
||||
src/common/linux/safe_readlink_unittest.cc \
|
||||
src/common/linux/tests/crash_generator.cc \
|
||||
src/common/tests/file_utils.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_common_dumper_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing \
|
||||
$(PTHREAD_CFLAGS)
|
||||
src_common_dumper_unittest_LDADD = $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
|
||||
endif
|
||||
|
||||
src_tools_linux_md2core_minidump_2_core_unittest_SOURCES = \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc \
|
||||
src/tools/linux/md2core/minidump_memory_range_unittest.cc
|
||||
src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
|
||||
endif LINUX_HOST
|
||||
|
||||
if !DISABLE_PROCESSOR
|
||||
src_processor_address_map_unittest_SOURCES = \
|
||||
src/processor/address_map_unittest.cc
|
||||
src_processor_address_map_unittest_LDADD = \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_binarystream_unittest_SOURCES = \
|
||||
src/processor/binarystream_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_binarystream_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_binarystream_unittest_LDADD = \
|
||||
src/processor/binarystream.o
|
||||
|
||||
src_processor_basic_source_line_resolver_unittest_SOURCES = \
|
||||
src/processor/basic_source_line_resolver_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_basic_source_line_resolver_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_basic_source_line_resolver_unittest_LDADD = \
|
||||
src/processor/basic_source_line_resolver.o \
|
||||
src/processor/cfi_frame_info.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/logging.o \
|
||||
src/processor/source_line_resolver_base.o \
|
||||
src/processor/tokenize.o
|
||||
|
||||
src_processor_cfi_frame_info_unittest_SOURCES = \
|
||||
src/processor/cfi_frame_info_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_cfi_frame_info_unittest_LDADD = \
|
||||
src/processor/cfi_frame_info.o \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o
|
||||
src_processor_cfi_frame_info_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
|
||||
src_processor_contained_range_map_unittest_SOURCES = \
|
||||
src/processor/contained_range_map_unittest.cc
|
||||
src_processor_contained_range_map_unittest_LDADD = \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_exploitability_unittest_SOURCES = \
|
||||
src/processor/exploitability_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_exploitability_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_exploitability_unittest_LDADD = \
|
||||
src/processor/minidump_processor.o \
|
||||
src/processor/process_state.o \
|
||||
src/processor/disassembler_x86.o \
|
||||
src/processor/exploitability.o \
|
||||
src/processor/exploitability_win.o \
|
||||
src/processor/basic_code_modules.o \
|
||||
src/processor/basic_source_line_resolver.o \
|
||||
src/processor/call_stack.o \
|
||||
src/processor/cfi_frame_info.o \
|
||||
src/processor/logging.o \
|
||||
src/processor/minidump.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/source_line_resolver_base.o \
|
||||
src/processor/stackwalker.o \
|
||||
src/processor/stackwalker_amd64.o \
|
||||
src/processor/stackwalker_arm.o \
|
||||
src/processor/stackwalker_ppc.o \
|
||||
src/processor/stackwalker_sparc.o \
|
||||
src/processor/stackwalker_x86.o \
|
||||
src/processor/tokenize.o \
|
||||
src/third_party/libdisasm/libdisasm.a
|
||||
|
||||
src_processor_disassembler_x86_unittest_SOURCES = \
|
||||
src/processor/disassembler_x86_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_disassembler_x86_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_disassembler_x86_unittest_LDADD = \
|
||||
src/processor/disassembler_x86.o \
|
||||
src/third_party/libdisasm/libdisasm.a
|
||||
|
||||
src_processor_fast_source_line_resolver_unittest_SOURCES = \
|
||||
src/processor/fast_source_line_resolver_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_fast_source_line_resolver_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_fast_source_line_resolver_unittest_LDADD = \
|
||||
src/processor/fast_source_line_resolver.o \
|
||||
src/processor/basic_source_line_resolver.o \
|
||||
src/processor/cfi_frame_info.o \
|
||||
src/processor/module_comparer.o \
|
||||
src/processor/module_serializer.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/logging.o \
|
||||
src/processor/source_line_resolver_base.o \
|
||||
src/processor/tokenize.o
|
||||
|
||||
src_processor_map_serializers_unittest_SOURCES = \
|
||||
src/processor/map_serializers_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_map_serializers_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_map_serializers_unittest_LDADD = \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_minidump_processor_unittest_SOURCES = \
|
||||
src/processor/minidump_processor_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_minidump_processor_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_minidump_processor_unittest_LDADD = \
|
||||
src/processor/basic_code_modules.o \
|
||||
src/processor/basic_source_line_resolver.o \
|
||||
src/processor/call_stack.o \
|
||||
src/processor/cfi_frame_info.o \
|
||||
src/processor/disassembler_x86.o \
|
||||
src/processor/exploitability.o \
|
||||
src/processor/exploitability_win.o \
|
||||
src/processor/logging.o \
|
||||
src/processor/minidump_processor.o \
|
||||
src/processor/minidump.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/process_state.o \
|
||||
src/processor/source_line_resolver_base.o \
|
||||
src/processor/stackwalker.o \
|
||||
src/processor/stackwalker_amd64.o \
|
||||
src/processor/stackwalker_arm.o \
|
||||
src/processor/stackwalker_ppc.o \
|
||||
src/processor/stackwalker_sparc.o \
|
||||
src/processor/stackwalker_x86.o \
|
||||
src/processor/tokenize.o \
|
||||
src/third_party/libdisasm/libdisasm.a
|
||||
|
||||
src_processor_minidump_unittest_SOURCES = \
|
||||
src/common/test_assembler.cc \
|
||||
src/processor/minidump_unittest.cc \
|
||||
src/processor/synth_minidump.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_minidump_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_minidump_unittest_LDADD = \
|
||||
src/processor/basic_code_modules.o \
|
||||
src/processor/logging.o \
|
||||
src/processor/minidump.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_static_address_map_unittest_SOURCES = \
|
||||
src/processor/static_address_map_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_static_address_map_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_static_address_map_unittest_LDADD = \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_static_contained_range_map_unittest_SOURCES = \
|
||||
src/processor/static_contained_range_map_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_static_contained_range_map_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_static_contained_range_map_unittest_LDADD = \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_static_map_unittest_SOURCES = \
|
||||
src/processor/static_map_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_static_map_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_static_map_unittest_LDADD = \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_static_range_map_unittest_SOURCES = \
|
||||
src/processor/static_range_map_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_static_range_map_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
src_processor_static_range_map_unittest_LDADD = \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_pathname_stripper_unittest_SOURCES = \
|
||||
src/processor/pathname_stripper_unittest.cc
|
||||
src_processor_pathname_stripper_unittest_LDADD = \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_postfix_evaluator_unittest_SOURCES = \
|
||||
src/processor/postfix_evaluator_unittest.cc
|
||||
src_processor_postfix_evaluator_unittest_LDADD = \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_range_map_unittest_SOURCES = \
|
||||
src/processor/range_map_unittest.cc
|
||||
src_processor_range_map_unittest_LDADD = \
|
||||
src/processor/logging.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_stackwalker_selftest_SOURCES = \
|
||||
src/processor/stackwalker_selftest.cc
|
||||
src_processor_stackwalker_selftest_LDADD = \
|
||||
src/processor/basic_code_modules.o \
|
||||
src/processor/basic_source_line_resolver.o \
|
||||
src/processor/call_stack.o \
|
||||
src/processor/disassembler_x86.o \
|
||||
src/processor/exploitability.o \
|
||||
src/processor/exploitability_win.o \
|
||||
src/processor/logging.o \
|
||||
src/processor/minidump.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/source_line_resolver_base.o \
|
||||
src/processor/stackwalker.o \
|
||||
src/processor/stackwalker_amd64.o \
|
||||
src/processor/stackwalker_arm.o \
|
||||
src/processor/stackwalker_ppc.o \
|
||||
src/processor/stackwalker_sparc.o \
|
||||
src/processor/stackwalker_x86.o \
|
||||
src/processor/tokenize.o
|
||||
|
||||
src_processor_stackwalker_amd64_unittest_SOURCES = \
|
||||
src/common/test_assembler.cc \
|
||||
src/processor/stackwalker_amd64_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_stackwalker_amd64_unittest_LDADD = \
|
||||
src/libbreakpad.a
|
||||
src_processor_stackwalker_amd64_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
|
||||
src_processor_stackwalker_arm_unittest_SOURCES = \
|
||||
src/common/test_assembler.cc \
|
||||
src/processor/stackwalker_arm_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_stackwalker_arm_unittest_LDADD = \
|
||||
src/libbreakpad.a
|
||||
src_processor_stackwalker_arm_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
|
||||
src_processor_stackwalker_x86_unittest_SOURCES = \
|
||||
src/common/test_assembler.cc \
|
||||
src/processor/stackwalker_x86_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_processor_stackwalker_x86_unittest_LDADD = \
|
||||
src/libbreakpad.a
|
||||
src_processor_stackwalker_x86_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
|
||||
src_processor_synth_minidump_unittest_SOURCES = \
|
||||
src/common/test_assembler.cc \
|
||||
src/common/test_assembler.h \
|
||||
src/processor/synth_minidump_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc \
|
||||
src/processor/synth_minidump.cc \
|
||||
src/processor/synth_minidump.h
|
||||
src_processor_synth_minidump_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
|
||||
src_common_test_assembler_unittest_SOURCES = \
|
||||
src/common/test_assembler.cc \
|
||||
src/common/test_assembler.h \
|
||||
src/common/test_assembler_unittest.cc \
|
||||
src/testing/gtest/src/gtest-all.cc \
|
||||
src/testing/gtest/src/gtest_main.cc \
|
||||
src/testing/src/gmock-all.cc
|
||||
src_common_test_assembler_unittest_CPPFLAGS = \
|
||||
-I$(top_srcdir)/src \
|
||||
-I$(top_srcdir)/src/testing/include \
|
||||
-I$(top_srcdir)/src/testing/gtest/include \
|
||||
-I$(top_srcdir)/src/testing/gtest \
|
||||
-I$(top_srcdir)/src/testing
|
||||
|
||||
## Non-installables
|
||||
noinst_PROGRAMS =
|
||||
noinst_SCRIPTS = $(check_SCRIPTS)
|
||||
|
||||
src_processor_minidump_dump_SOURCES = \
|
||||
src/processor/minidump_dump.cc
|
||||
src_processor_minidump_dump_LDADD = \
|
||||
src/processor/basic_code_modules.o \
|
||||
src/processor/logging.o \
|
||||
src/processor/minidump.o \
|
||||
src/processor/pathname_stripper.o
|
||||
|
||||
src_processor_minidump_stackwalk_SOURCES = \
|
||||
src/processor/minidump_stackwalk.cc
|
||||
src_processor_minidump_stackwalk_LDADD = \
|
||||
src/processor/basic_code_modules.o \
|
||||
src/processor/basic_source_line_resolver.o \
|
||||
src/processor/binarystream.o \
|
||||
src/processor/call_stack.o \
|
||||
src/processor/cfi_frame_info.o \
|
||||
src/processor/disassembler_x86.o \
|
||||
src/processor/exploitability.o \
|
||||
src/processor/exploitability_win.o \
|
||||
src/processor/logging.o \
|
||||
src/processor/minidump.o \
|
||||
src/processor/minidump_processor.o \
|
||||
src/processor/pathname_stripper.o \
|
||||
src/processor/process_state.o \
|
||||
src/processor/simple_symbol_supplier.o \
|
||||
src/processor/source_line_resolver_base.o \
|
||||
src/processor/stackwalker.o \
|
||||
src/processor/stackwalker_amd64.o \
|
||||
src/processor/stackwalker_arm.o \
|
||||
src/processor/stackwalker_ppc.o \
|
||||
src/processor/stackwalker_sparc.o \
|
||||
src/processor/stackwalker_x86.o \
|
||||
src/processor/tokenize.o \
|
||||
src/third_party/libdisasm/libdisasm.a
|
||||
|
||||
endif !DISABLE_PROCESSOR
|
||||
|
||||
## Additional files to be included in a source distribution
|
||||
##
|
||||
## find src/client src/common src/processor/testdata src/tools \
|
||||
## -type f \! -path '*/.svn/*' -print | sort | \
|
||||
## sed -e s/'^\(.*\)$'/'\t\1 \\'/
|
||||
EXTRA_DIST = \
|
||||
$(SCRIPTS) \
|
||||
src/processor/stackwalk_selftest_sol.s \
|
||||
src/client/linux/handler/Makefile \
|
||||
src/client/linux/handler/exception_handler.cc \
|
||||
src/client/linux/handler/exception_handler.h \
|
||||
src/client/linux/handler/exception_handler_test.cc \
|
||||
src/client/linux/handler/linux_thread.cc \
|
||||
src/client/linux/handler/linux_thread.h \
|
||||
src/client/linux/handler/linux_thread_test.cc \
|
||||
src/client/linux/handler/minidump_generator.cc \
|
||||
src/client/linux/handler/minidump_generator.h \
|
||||
src/client/linux/handler/minidump_test.cc \
|
||||
src/client/mac/handler/dynamic_images.cc \
|
||||
src/client/mac/handler/dynamic_images.h \
|
||||
src/client/mac/handler/exception_handler.cc \
|
||||
src/client/mac/handler/exception_handler.h \
|
||||
src/client/mac/handler/exception_handler_test.cc \
|
||||
src/client/mac/handler/minidump_generator.cc \
|
||||
src/client/mac/handler/minidump_generator.h \
|
||||
src/client/mac/handler/minidump_generator_test.cc \
|
||||
src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj \
|
||||
src/client/mac/handler/protected_memory_allocator.cc \
|
||||
src/client/mac/handler/protected_memory_allocator.h \
|
||||
src/client/minidump_file_writer-inl.h \
|
||||
src/client/minidump_file_writer.cc \
|
||||
src/client/minidump_file_writer.h \
|
||||
src/client/minidump_file_writer_unittest.cc \
|
||||
src/client/solaris/handler/Makefile \
|
||||
src/client/solaris/handler/exception_handler.cc \
|
||||
src/client/solaris/handler/exception_handler.h \
|
||||
src/client/solaris/handler/exception_handler_test.cc \
|
||||
src/client/solaris/handler/minidump_generator.cc \
|
||||
src/client/solaris/handler/minidump_generator.h \
|
||||
src/client/solaris/handler/minidump_test.cc \
|
||||
src/client/solaris/handler/solaris_lwp.cc \
|
||||
src/client/solaris/handler/solaris_lwp.h \
|
||||
src/client/windows/breakpad_client.sln \
|
||||
src/client/windows/handler/exception_handler.cc \
|
||||
src/client/windows/handler/exception_handler.h \
|
||||
src/client/windows/handler/exception_handler.vcproj \
|
||||
src/client/windows/sender/crash_report_sender.cc \
|
||||
src/client/windows/sender/crash_report_sender.h \
|
||||
src/client/windows/sender/crash_report_sender.vcproj \
|
||||
src/common/convert_UTF.c \
|
||||
src/common/convert_UTF.h \
|
||||
src/common/linux/dump_symbols.cc \
|
||||
src/common/linux/dump_symbols.h \
|
||||
src/common/linux/elf_symbols_to_module.cc \
|
||||
src/common/linux/elf_symbols_to_module.h \
|
||||
src/common/linux/file_id.cc \
|
||||
src/common/linux/file_id.h \
|
||||
src/common/linux/guid_creator.cc \
|
||||
src/common/linux/guid_creator.h \
|
||||
src/common/linux/http_upload.cc \
|
||||
src/common/linux/http_upload.h \
|
||||
src/common/mac/HTTPMultipartUpload.h \
|
||||
src/common/mac/HTTPMultipartUpload.m \
|
||||
src/common/mac/dump_syms.h \
|
||||
src/common/mac/dump_syms.mm \
|
||||
src/common/mac/file_id.cc \
|
||||
src/common/mac/file_id.h \
|
||||
src/common/mac/macho_id.cc \
|
||||
src/common/mac/macho_id.h \
|
||||
src/common/mac/macho_utilities.cc \
|
||||
src/common/mac/macho_utilities.h \
|
||||
src/common/mac/macho_walker.cc \
|
||||
src/common/mac/macho_walker.h \
|
||||
src/common/mac/string_utilities.cc \
|
||||
src/common/mac/string_utilities.h \
|
||||
src/common/md5.cc \
|
||||
src/common/md5.h \
|
||||
src/common/solaris/dump_symbols.cc \
|
||||
src/common/solaris/dump_symbols.h \
|
||||
src/common/solaris/file_id.cc \
|
||||
src/common/solaris/file_id.h \
|
||||
src/common/solaris/guid_creator.cc \
|
||||
src/common/solaris/guid_creator.h \
|
||||
src/common/solaris/message_output.h \
|
||||
src/common/string_conversion.cc \
|
||||
src/common/string_conversion.h \
|
||||
src/common/windows/guid_string.cc \
|
||||
src/common/windows/guid_string.h \
|
||||
src/common/windows/http_upload.cc \
|
||||
src/common/windows/http_upload.h \
|
||||
src/common/windows/pdb_source_line_writer.cc \
|
||||
src/common/windows/pdb_source_line_writer.h \
|
||||
src/common/windows/string_utils-inl.h \
|
||||
src/common/windows/string_utils.cc \
|
||||
src/processor/testdata/minidump2.dmp \
|
||||
src/processor/testdata/minidump2.dump.out \
|
||||
src/processor/testdata/minidump2.stackwalk.machine_readable.out \
|
||||
src/processor/testdata/minidump2.stackwalk.out \
|
||||
src/processor/testdata/module1.out \
|
||||
src/processor/testdata/module2.out \
|
||||
src/processor/testdata/module3_bad.out \
|
||||
src/processor/testdata/module4_bad.out \
|
||||
src/processor/testdata/symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym \
|
||||
src/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym \
|
||||
src/processor/testdata/test_app.cc \
|
||||
src/tools/linux/dump_syms/Makefile \
|
||||
src/tools/linux/dump_syms/dump_syms.cc \
|
||||
src/tools/linux/symupload/Makefile \
|
||||
src/tools/linux/symupload/minidump_upload.cc \
|
||||
src/tools/linux/symupload/sym_upload.cc \
|
||||
src/tools/mac/crash_report/crash_report.mm \
|
||||
src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj \
|
||||
src/tools/mac/crash_report/on_demand_symbol_supplier.h \
|
||||
src/tools/mac/crash_report/on_demand_symbol_supplier.mm \
|
||||
src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj \
|
||||
src/tools/mac/dump_syms/dump_syms_tool.m \
|
||||
src/tools/mac/symupload/minidump_upload.m \
|
||||
src/tools/mac/symupload/symupload.m \
|
||||
src/tools/mac/symupload/symupload.xcodeproj/project.pbxproj \
|
||||
src/tools/solaris/dump_syms/Makefile \
|
||||
src/tools/solaris/dump_syms/dump_syms.cc \
|
||||
src/tools/solaris/dump_syms/run_regtest.sh \
|
||||
src/tools/solaris/dump_syms/testdata/dump_syms_regtest.cc \
|
||||
src/tools/solaris/dump_syms/testdata/dump_syms_regtest.o \
|
||||
src/tools/solaris/dump_syms/testdata/dump_syms_regtest.stabs \
|
||||
src/tools/solaris/dump_syms/testdata/dump_syms_regtest.sym \
|
||||
src/tools/windows/converter/ms_symbol_server_converter.cc \
|
||||
src/tools/windows/converter/ms_symbol_server_converter.h \
|
||||
src/tools/windows/converter/ms_symbol_server_converter.vcproj \
|
||||
src/tools/windows/dump_syms/dump_syms.cc \
|
||||
src/tools/windows/dump_syms/dump_syms.vcproj \
|
||||
src/tools/windows/dump_syms/run_regtest.sh \
|
||||
src/tools/windows/dump_syms/testdata/dump_syms_regtest.cc \
|
||||
src/tools/windows/dump_syms/testdata/dump_syms_regtest.pdb \
|
||||
src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym \
|
||||
src/tools/windows/symupload/symupload.cc \
|
||||
src/tools/windows/symupload/symupload.vcproj
|
File diff suppressed because it is too large
Load Diff
|
@ -1,43 +0,0 @@
|
|||
Breakpad is a set of client and server components which implement a
|
||||
crash-reporting system.
|
||||
|
||||
|
||||
-----
|
||||
Getting started in 32-bit mode (from trunk)
|
||||
Configure: CXXFLAGS=-m32 CFLAGS=-m32 CPPFLAGS=-m32 ./configure
|
||||
Build: make
|
||||
Test: make check
|
||||
Install: make install
|
||||
|
||||
If you need to reconfigure your build be sure to run "make distclean" first.
|
||||
|
||||
|
||||
-----
|
||||
To request change review:
|
||||
0. Get access to a read-write copy of source.
|
||||
Owners at http://code.google.com/p/google-breakpad/ are able to grant
|
||||
this access.
|
||||
|
||||
1. Check out a read-write copy of source using instructions at
|
||||
http://code.google.com/p/google-breakpad/source/checkout
|
||||
|
||||
2. Make changes. Build and test your changes.
|
||||
For core code like processor use methods above.
|
||||
For linux/mac/windows, there are test targets in each project file.
|
||||
|
||||
3. Download http://codereview.appspot.com/static/upload.py
|
||||
|
||||
4. Run upload.py from the 'src' directory:
|
||||
upload.py --server=breakpad.appspot.com
|
||||
|
||||
You will be prompted for credential and a description.
|
||||
|
||||
5. At http://breakpad.appspot.com you'll find your issue listed; click on it,
|
||||
and select Publish+Mail, and enter in the code reviewer and CC
|
||||
google-breakpad-dev@googlegroups.com
|
||||
|
||||
6. When applying code review feedback, specify the '-i' option when running
|
||||
upload.py again and pass the issue number so it updates the existing issue,
|
||||
rather than creating a new one.
|
||||
Be sure to rerun upload.py from the same directory as you did for previous
|
||||
uploads to allow for proper diff calculations.
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue