diff options
author | Steve Block <steveblock@google.com> | 2010-09-29 17:32:26 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2010-09-29 17:35:08 +0100 |
commit | 68513a70bcd92384395513322f1b801e7bf9c729 (patch) | |
tree | 161b50f75a5921d61731bb25e730005994fcec85 /WebKitTools | |
parent | fd5c6425ce58eb75211be7718d5dee960842a37e (diff) | |
download | external_webkit-68513a70bcd92384395513322f1b801e7bf9c729.zip external_webkit-68513a70bcd92384395513322f1b801e7bf9c729.tar.gz external_webkit-68513a70bcd92384395513322f1b801e7bf9c729.tar.bz2 |
Merge WebKit at r67908: Initial merge by Git
Change-Id: I43a553e7b3299b28cb6ee8aa035ed70fe342b972
Diffstat (limited to 'WebKitTools')
98 files changed, 4780 insertions, 2040 deletions
diff --git a/WebKitTools/BuildSlaveSupport/build.webkit.org-config/config.json b/WebKitTools/BuildSlaveSupport/build.webkit.org-config/config.json index 89a768a..54a0dfe 100644 --- a/WebKitTools/BuildSlaveSupport/build.webkit.org-config/config.json +++ b/WebKitTools/BuildSlaveSupport/build.webkit.org-config/config.json @@ -196,7 +196,7 @@ } ], - "schedulers": [ { "type": "AnyBranchScheduler", "name": "trunk", "branches": ["trunk"], "treeStableTimer": 45.0, + "schedulers": [ { "type": "AnyBranchScheduler", "name": "trunk", "change_filter": "trunk_filter", "treeStableTimer": 45.0, "builderNames": ["Leopard Intel Release (Build)", "Leopard Intel Debug (Build)", "SnowLeopard Intel Release (Build)", "SnowLeopard Intel Leaks", "Windows Release (Build)", "Windows Debug (Build)", diff --git a/WebKitTools/BuildSlaveSupport/build.webkit.org-config/master.cfg b/WebKitTools/BuildSlaveSupport/build.webkit.org-config/master.cfg index f30ac16..aca3c65 100644 --- a/WebKitTools/BuildSlaveSupport/build.webkit.org-config/master.cfg +++ b/WebKitTools/BuildSlaveSupport/build.webkit.org-config/master.cfg @@ -6,6 +6,7 @@ c = BuildmasterConfig = {} from buildbot.buildslave import BuildSlave from buildbot.changes.pb import PBChangeSource from buildbot.scheduler import AnyBranchScheduler, Triggerable +from buildbot.schedulers.filter import ChangeFilter from buildbot.status import html from buildbot.process import buildstep, factory, properties from buildbot.steps import master, shell, source, transfer, trigger @@ -419,6 +420,8 @@ class NewBuildAndTestFactory(BuildAndTestFactory): class TestWebKit2Factory(TestFactory): TestClass = RunWebKit2Tests +trunk_filter = ChangeFilter(branch=["trunk", None]) + def loadBuilderConfig(c): # FIXME: These file handles are leaked. passwords = simplejson.load(open('passwords.json')) @@ -431,6 +434,8 @@ def loadBuilderConfig(c): c['schedulers'] = [] for scheduler in config['schedulers']: + if "change_filter" in scheduler: + scheduler["change_filter"] = globals()[scheduler["change_filter"]] kls = globals()[scheduler.pop('type')] c['schedulers'].append(kls(**scheduler)) diff --git a/WebKitTools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css b/WebKitTools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css new file mode 100644 index 0000000..4223807 --- /dev/null +++ b/WebKitTools/BuildSlaveSupport/build.webkit.org-config/public_html/default.css @@ -0,0 +1,524 @@ +div.header { display: none; } +body > hr { display: none; } +div.content h1 { display: none; } + +body.interface { + background: url(bg_gradient.jpg) repeat-x; + font-family: Verdana, Cursor; + font-size: 10px; + font-weight: bold; + background-color: #fff; + color: #333; +} + +a:link,a:visited,a:active { + color: #444; +} + +table { + border-spacing: 1px 1px; +} + +table td { + padding: 3px 2px 3px 2px; +} + +.Project { + min-width: 6em; +} + +.LastBuild,.Activity { + padding: 0 0 0 4px; +} + +/* Chromium Specific styles */ +div.BuildResultInfo { + color: #444; +} + +div.Announcement { + margin-bottom: 1em; +} + +div.Announcement>a:hover { + color: black; +} + +div.Announcement>div.Notice { + background-color: #afdaff; + padding: 0.5em; + font-size: 16px; + text-align: center; +} + +div.Announcement>div.Open { + border: 3px solid #8fdf5f; + padding: 0.5em; + font-size: 16px; + text-align: center; +} + +div.Announcement>div.Closed { + border: 5px solid #e98080; + padding: 0.5em; + font-size: 24px; + font-weight: bold; + text-align: center; +} + +td.Time { + color: #000; + border-bottom: 1px solid #aaa; + background-color: #eee; +} + +td.Activity,td.Change,td.Builder { + color: #333333; + background-color: #CCCCCC; +} + +td.Change { + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; +} + +td.Event { + color: #777; + background-color: #ddd; + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; +} + +td.Activity { + border-top-left-radius: 10px; + -webkit-border-top-left-radius: 10px; + -moz-border-radius-topleft: 10px; + min-height: 20px; + padding: 2px 0 2px 0; +} + +td.idle,td.waiting,td.offline,td.building { + border-top-left-radius: 0px; + -webkit-border-top-left-radius: 0px; + -moz-border-radius-topleft: 0px; +} + +.LastBuild { + border-top-left-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; + border-top-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topright: 5px; +} + +/* Console view styles */ +td.DevRev { + padding: 4px 8px 4px 8px; + color: #333333; + border-top-left-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; + background-color: #eee; + width: 1%; +} + +td.DevRevCollapse { + border-bottom-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; +} + +td.DevName { + padding: 4px 8px 4px 8px; + color: #333333; + background-color: #eee; + width: 1%; + text-align: left; +} + +td.DevStatus { + padding: 4px 4px 4px 4px; + color: #333333; + background-color: #eee; +} + +td.DevSlave { + padding: 4px 4px 4px 4px; + color: #333333; + background-color: #eee; +} + +td.first { + border-top-left-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; +} + +td.last { + border-top-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topright: 5px; +} + +td.DevStatusCategory { + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-width: 1px; + border-style: solid; +} + +td.DevStatusCollapse { + border-bottom-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-radius-bottomright: 5px; +} + +td.DevDetails { + font-weight: normal; + padding: 8px 8px 8px 8px; + color: #333333; + background-color: #eee; + text-align: left; +} + +td.DevComment { + font-weight: normal; + padding: 8px 8px 8px 8px; + color: #333333; + border-bottom-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-radius-bottomright: 5px; + border-bottom-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; + background-color: #eee; + text-align: left; +} + +td.Alt { + background-color: #ddd; +} + +.legend { + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + width: 100px; + max-width: 100px; + text-align: center; + padding: 2px 2px 2px 2px; + height: 14px; + white-space: nowrap; +} + +.DevStatusBox { + text-align: center; + height: 20px; + padding: 0 2px; + line-height: 0; + white-space: nowrap; +} + +.DevStatusBox a { + opacity: 0.85; + border-width: 1px; + border-style: solid; + border-radius: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + display: block; + width: 90%; + height: 20px; + line-height: 20px; + margin-left: auto; + margin-right: auto; +} + +.DevSlaveBox { + text-align: center; + height: 10px; + padding: 0 2px; + line-height: 0; + white-space: nowrap; +} + +.DevSlaveBox a { + opacity: 0.85; + border-width: 1px; + border-style: solid; + border-radius: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + display: block; + width: 90%; + height: 10px; + line-height: 20px; + margin-left: auto; + margin-right: auto; +} + +a.noround { + border-radius: 0px; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + position: relative; + margin-top: -8px; + margin-bottom: -8px; + height: 36px; + border-top-width: 0; + border-bottom-width: 0; +} + +a.begin { + border-top-width: 1px; + position: relative; + margin-top: 0px; + margin-bottom: -7px; + height: 27px; + border-top-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-right-radius: 4px; + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +a.end { + border-bottom-width: 1px; + position: relative; + margin-top: -7px; + margin-bottom: 0px; + height: 27px; + border-bottom-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.center_align { + text-align: center; +} + +.right_align { + text-align: right; +} + +.left_align { + text-align: left; +} + +div.BuildWaterfall { + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + position: absolute; + left: 0px; + top: 0px; + background-color: #FFFFFF; + padding: 4px 4px 4px 4px; + float: left; + display: none; + border-width: 1px; + border-style: solid; +} + +/* LastBuild, BuildStep states */ +.success { + color: #FFFFFF; + background-color: #8FDF5F; + border-color: #4F8530; +} + +.failure { + color: #FFFFFF; + background-color: #E98080; + border-color: #A77272; +} + +.warnings { + color: #FFFFFF; + background-color: #FFC343; + border-color: #C29D46; +} + +.exception { + color: #FFFFFF; + background-color: #E0B0FF; + border-color: #ACA0B3; +} + +.start,.running,td.building { + color: #666666; + background-color: #FFFC6C; + border-color: #C5C56D; +} + +.offline,td.offline { + color: #FFFFFF; + background-color: #E0B0FF; + border-color: #dddddd; +} + + +.start { + border-bottom-left-radius: 10px; + -webkit-border-bottom-left-radius: 10px; + -moz-border-radius-bottomleft: 10px; + border-bottom-right-radius: 10px; + -webkit-border-bottom-right-radius: 10px; + -moz-border-radius-bottomright: 10px; +} + +.notstarted { + border-width: 1px; + border-style: solid; + border-color: #aaa; + background-color: #fff; +} + +.closed { + background-color: #ff0000; +} + +.closed .large { + font-size: 1.5em; + font-weight: bolder; +} + +td.Project a:hover,td.start a:hover { + color: #000; +} + +.mini-box { + text-align: center; + height: 20px; + padding: 0 2px; + line-height: 0; + white-space: nowrap; +} + +.mini-box a { + border-radius: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + display: block; + width: 100%; + height: 20px; + line-height: 20px; + margin-top: -30px; +} + +.mini-closed { + -box-sizing: border-box; + -webkit-box-sizing: border-box; + border: 4px solid red; +} + +/* grid styles */ +table.Grid { + border-collapse: collapse; +} + +table.Grid tr td { + padding: 0.2em; + margin: 0px; + text-align: center; +} + +table.Grid tr td.title { + font-size: 90%; + border-right: 1px gray solid; + border-bottom: 1px gray solid; +} + +table.Grid tr td.sourcestamp { + font-size: 90%; +} + +table.Grid tr td.builder { + text-align: right; + font-size: 90%; +} + +table.Grid tr td.build { + border: 1px gray solid; +} + +/* column container */ +div.column { + margin: 0 2em 2em 0; + float: left; +} + +/* info tables */ +table.info { + border-spacing: 1px; +} + +table.info td { + padding: 0.1em 1em 0.1em 1em; + text-align: center; +} + +table.info th { + padding: 0.2em 1.5em 0.2em 1.5em; + text-align: center; +} + +table.info td.left { + text-align: left +} + +.alt { + background-color: #d6d6d6; +} + +li { + padding: 0.1em 1em 0.1em 1em; +} + +.result { + padding: 0.3em 1em 0.3em 1em; +} + +/* log view */ +.log * { + vlink: #800080; + font-family: "Courier New", courier, monotype; +} + +span.stdout { + color: black; +} + +span.stderr { + color: red; +} + +span.header { + color: blue; +} + +/* revision & email */ +.revision .full { + display: none; +} + +.user .email { + display: none; +} + +/* change comments (use regular colors here) */ +pre.comments>a:link,pre.comments>a:visited { + color: blue; +} + +pre.comments>a:active { + color: purple; +} diff --git a/WebKitTools/BuildSlaveSupport/build.webkit.org-config/public_html/index.html b/WebKitTools/BuildSlaveSupport/build.webkit.org-config/templates/root.html index c6d2343..c6d2343 100644..100755 --- a/WebKitTools/BuildSlaveSupport/build.webkit.org-config/public_html/index.html +++ b/WebKitTools/BuildSlaveSupport/build.webkit.org-config/templates/root.html diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog index aa525b5..eace217 100644 --- a/WebKitTools/ChangeLog +++ b/WebKitTools/ChangeLog @@ -1,3 +1,1373 @@ +2010-09-20 Dirk Pranke <dpranke@chromium.org> + + Reviewed by Ojan Vafai. + + new-run-webkit-tests: refactor command line args getting passed to DRT + + This change cleans up some argument parsing between functions to get + rid of some overlapping data structures. There should be no functional + changes in this patch; it is pure refactoring in preparation for + landing the Chrome GPU port and adding a generic way to pass + args to DRT/TestShell. + + https://bugs.webkit.org/show_bug.cgi?id=46135 + + * Scripts/webkitpy/layout_tests/layout_package/dump_render_tree_thread.py: + - pass the options argument explicitly to the threads and drivers, + also consolidate the passing of options to the driver. + - pass options directly to process_output() to remove a couple + parameters (minor cleanup). + * Scripts/webkitpy/layout_tests/port/base.py: + - pass the options argument to Port.create_driver(). + * Scripts/webkitpy/layout_tests/port/base_unittest.py: + - update Port.create_driver() test + * Scripts/webkitpy/layout_tests/port/chromium.py: + - pass the options argument to Port.create_driver(), and clean up + building of the cmd line for DRT. + * Scripts/webkitpy/layout_tests/port/dryrun.py: + - pass the options argument to Port.create_driver() + * Scripts/webkitpy/layout_tests/port/test.py: + - pass the options argument to Port.create_driver() + * Scripts/webkitpy/layout_tests/port/webkit.py: + - pass the options argument to Port.create_driver(), and clean up + building of the cmd line for DRT. + * Scripts/webkitpy/layout_tests/run_webkit_tests.py: + - consolidate args in _get_dump_render_tree_args and rename to + _get_test_args(); move all of the command-line args to the + Port implementations. + +2010-09-20 Andrew Wilson <atwilson@chromium.org> + + Revert change which was accidentally committed along with some expectation changes. + + * Scripts/webkitpy/layout_tests/port/base.py: + +2010-09-20 Mihai Parparita <mihaip@chromium.org> + + Reviewed by Adam Barth. + + Add explicit --force-patch flag to webkitpy tools + https://bugs.webkit.org/show_bug.cgi?id=46103 + + It wasn't obvious until I read the applypatch.py source code that + --non-interfactive implies passing --force to patch. Add --force-patch + as an alias to the flag, so that this behavior is more discoverable. + + * Scripts/webkitpy/tool/steps/applypatch.py: + * Scripts/webkitpy/tool/steps/options.py: + +2010-09-20 Eric Seidel <eric@webkit.org> + + Unreviewed, adding a line which got dropped and is trivially correct (and tested). + + commit-queue can't land patches + https://bugs.webkit.org/show_bug.cgi?id=46138 + + Add a line of code I forgot in my last commit. + + * Scripts/webkitpy/common/net/bugzilla.py: + * Scripts/webkitpy/common/net/bugzilla_unittest.py: + +2010-09-20 Adam Barth <abarth@webkit.org> + + Reviewed by Eric Seidel. + + The commit-cluster bots still race to lock patch_ids + https://bugs.webkit.org/show_bug.cgi?id=46130 + + It turns out we need to use a transaction object to make the + read/modify/write lock operation atomic. From reading the AppEngine + documentation, I think this patch should do what we want. It's hard to + test locally because the test instance isn't distributed in the same + way the production instance is. + + * QueueStatusServer/handlers/nextpatch.py: + * QueueStatusServer/model/activeworkitems.py: Added. + +2010-09-20 Andy Estes <aestes@apple.com> + + Reviewed by Adam Barth. + + REGRESSION (HTML5 Parser): Pages broken due to <tag<tag> parsing changes + https://bugs.webkit.org/show_bug.cgi?id=40961 + + Implement WebKitUsePreHTML5ParserQuirks preference. + + * DumpRenderTree/mac/DumpRenderTree.mm: + (resetDefaultsToConsistentValues): Reset WebKitUsePreHTML5ParserQuirks + to false after a test finishes. + +2010-09-20 Adam Roben <aroben@apple.com> + + Windows build fix + + * MiniBrowser/Configurations/MiniBrowserCommon.vsprops: Put + $(WebKitOutputDir)\include before $(WebKitLibrariesDir)\include so + we'll pick up the most recent versions of the headers. + +2010-09-20 Eric Seidel <eric@webkit.org> + + Reviewed by Adam Barth. + + commit-queue should check commit-queue+ again just before committing + https://bugs.webkit.org/show_bug.cgi?id=32679 + + Added a _revalidate_patch check, right before landing. + + Since _revalidate_patch passes the patch_id from the work item + back to bugzilla, I had to fix all of the previous queue tests to + use valid attachment ids (that's the majority of this change). + + In order to validate that the bug was still open, I had to teach + bugzilla.Bug about open/closed states. + + * Scripts/webkitpy/common/net/bugzilla.py: + * Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py: + * Scripts/webkitpy/tool/commands/queues.py: + * Scripts/webkitpy/tool/commands/queues_unittest.py: + * Scripts/webkitpy/tool/commands/queuestest.py: + * Scripts/webkitpy/tool/mocktool.py: + +2010-09-20 Mihai Parparita <mihaip@chromium.org> + + Unreviewed. + + Adding myself as a comitter. + + * Scripts/webkitpy/common/config/committers.py: + +2010-09-20 Adam Barth <abarth@webkit.org> + + Reviewed by Eric Seidel. + + Two instances of commit-queue try to process the same patch + https://bugs.webkit.org/show_bug.cgi?id=46113 + + This patch makes next-patch atomic so that the server won't vend the + same patch twice in the same hour. + + * QueueStatusServer/handlers/nextpatch.py: + +2010-09-20 Adam Roben <aroben@apple.com> + + Make WebKitTestRunner's wait-to-dump watchdog timer work on Windows + + We were previously trying to use a CFRunLoopTimer, but since Windows + doesn't use CFRunLoop on most threads this doesn't work. Now we use a + Windows-style timer on Windows. + + I also replaced all uses of "watchdog" with "watchdog timer". + + Fixes <http://webkit.org/b/46101> WebKitTestRunner's wait-to-dump + watchdog timer doesn't work on Windows + + Reviewed by Anders Carlsson. + + * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp: + (WTR::InjectedBundlePage::dump): Updated for rename. + + * WebKitTestRunner/InjectedBundle/LayoutTestController.cpp: Removed + platform-specific functions. + (WTR::LayoutTestController::LayoutTestController): Added call to + platformInitialize. + (WTR::LayoutTestController::waitUntilDone): Changed to call + initializeWaitToDumpWatchdogTimerIfNeeded instead of doing the work + right in this function. + (WTR::LayoutTestController::waitToDumpWatchdogTimerFired): Updated for + rename. + + * WebKitTestRunner/InjectedBundle/LayoutTestController.h: Added new + members needed to support the watchdog timer abstraction. Replaced + some "watchdog"s with "watchdog timer". + + * WebKitTestRunner/InjectedBundle/mac/LayoutTestControllerMac.mm: + Added. + (WTR::LayoutTestController::platformInitialize): Does nothing on this + platform. + (WTR::LayoutTestController::invalidateWaitToDumpWatchdog): Moved here + from LayoutTestController.cpp and changed to use an early return. + (WTR::waitUntilDoneWatchdogTimerFired): Moved here from + LayoutTestController.cpp. + (WTR::LayoutTestController::initializeWaitToDumpWatchdogTimerIfNeeded): + Moved code here from LayoutTestController::waitUntilDone and changed + to use an early return. + + * WebKitTestRunner/InjectedBundle/win/LayoutTestControllerWin.cpp: + Added. + (WTR::LayoutTestController::platformInitialize): Initialize our + watchdog timer. + (WTR::LayoutTestController::invalidateWaitToDumpWatchdog): Added. + Kills and clears the watchdog timer. + (WTR::waitToDumpWatchdogTimerFired): Added. Calls through to the + LayoutTestController member function of the same name. + (WTR::LayoutTestController::initializeWaitToDumpWatchdogTimerIfNeeded): + Added. Sets up the timer if it isn't already set. + + * WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj: Added + LayoutTestControllerMac.mm. + + * WebKitTestRunner/win/InjectedBundle.vcproj: Added + LayoutTestControllerWin.cpp. + +2010-09-20 Martin Robinson <mrobinson@igalia.com> + + Reviewed by Daniel Bates. + + [GTK] fast/forms/listbox-selection.html fails + https://bugs.webkit.org/show_bug.cgi?id=45942 + + Use the gdkModifersFromJSValue helper to parse all appropriate modifier + strings in keyDownCallback. + + * DumpRenderTree/gtk/EventSender.cpp: + (keyDownCallback): Use the gdkModifersFromJSValue instead of duplicating the + modifier parsing logic. + +2010-09-19 Sam Weinig <sam@webkit.org> + + Reviewed by Anders Carlsson. + + WebKit2 decidePolicyForNavigationAction should include mouse button information + <rdar://problem/8413165> + https://bugs.webkit.org/show_bug.cgi?id=46060 + + * MiniBrowser/mac/BrowserWindowController.m: + (decidePolicyForNavigationAction): + (decidePolicyForNewWindowAction): + +2010-09-19 Daniel Bates <dbates@rim.com> + + Reviewed by Martin Robinson. + + Add unit tests for diffs that delete or modify a change log entry + or describe changes that are far apart + https://bugs.webkit.org/show_bug.cgi?id=46046 + + Add additional unit tests to test change log diffs that contain + deletions or changes that are far apart from each other in the + ChangeLog file. + + * Scripts/webkitperl/VCSUtils_unittest/fixChangeLogPatch.pl: + - Added the following unit tests: + "fixChangeLogPatch: [no change] In-place change." + "fixChangeLogPatch: [no change] Remove first entry." + "fixChangeLogPatch: [no change] Remove entry in the middle." + "fixChangeLogPatch: [no change] Far apart changes (i.e. more than one chunk)." + +2010-09-19 Sam Weinig <sam@webkit.org> + + Reviewed by Anders Carlsson. + + Replace WKBundleRangeRef with WKBundleRangeHandleRef. + https://bugs.webkit.org/show_bug.cgi?id=46054 + + The new one acts like WKBundleNodeHandleRef and allows for getting a + wrapper in a specific world for the handle. + + * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp: + (WTR::propertyValue): + (WTR::propertyValueDouble): + (WTR::propertyValueInt): + (WTR::numericWindowPropertyValue): + (WTR::toStr): + (WTR::InjectedBundlePage::shouldBeginEditing): + (WTR::InjectedBundlePage::shouldEndEditing): + (WTR::InjectedBundlePage::shouldInsertNode): + (WTR::InjectedBundlePage::shouldInsertText): + (WTR::InjectedBundlePage::shouldDeleteRange): + (WTR::InjectedBundlePage::shouldChangeSelectedRange): + (WTR::InjectedBundlePage::shouldApplyStyle): + * WebKitTestRunner/InjectedBundle/InjectedBundlePage.h: + +2010-09-19 Kent Tamura <tkent@chromium.org> + + Unreviewed. Fix WebGL test regressions by r67809. + + * DumpRenderTree/chromium/WebPreferences.cpp: + (WebPreferences::applyTo): Call setExperimentalWebGLEnabled(). + +2010-09-19 Kent Tamura <tkent@chromium.org> + + Reviewed by Adam Barth. + + [DRT/Chromium] Fix a WebSettings handling bug + https://bugs.webkit.org/show_bug.cgi?id=45945 + + Before this change, Chromium DRT reset WebSettings for every new + window. It was wrong. + If new window is not the first one, we have to apply the same + settings as the first window. So, we introduce WebPreference to + store the current settings, and apply it to new windows. It's same + as test_shell's behavior. + + * DumpRenderTree/DumpRenderTree.gypi: + * DumpRenderTree/chromium/LayoutTestController.cpp: + Use WebPreferences instead of WebSettings. + (LayoutTestController::setUserStyleSheetEnabled): + (LayoutTestController::setUserStyleSheetLocation): + (LayoutTestController::setAuthorAndUserStylesEnabled): + (LayoutTestController::setPopupBlockingEnabled): + (LayoutTestController::disableImageLoading): + (LayoutTestController::setJavaScriptCanAccessClipboard): + (LayoutTestController::setXSSAuditorEnabled): + (LayoutTestController::setAllowUniversalAccessFromFileURLs): + (LayoutTestController::setAllowFileAccessFromFileURLs): + (LayoutTestController::overridePreference): + (LayoutTestController::setEditingBehavior): + * DumpRenderTree/chromium/TestShell.cpp: + (TestShell::resetWebSettings): Use WebPreferences. + (TestShell::runFileTest): ditto. + (TestShell::createNewWindow): Apply existing WebPreferences to a new WebView. + * DumpRenderTree/chromium/TestShell.h: + (TestShell::preferences): + (TestShell::applyPreferences): + * DumpRenderTree/chromium/WebPreferences.cpp: Added. + * DumpRenderTree/chromium/WebPreferences.h: Added. + +2010-09-18 Prasad Tammana <prasadt@chromium.org> + + Reviewed by David Levin. + + update-webkit --chromium spitting out a spurious error + https://bugs.webkit.org/show_bug.cgi?id=45868 + + * Scripts/update-webkit-chromium: Use commandExists() function to check for existence of gclient. + +2010-09-18 Sam Weinig <sam@webkit.org> + + Reviewed by Dan Bernstein. + + Improve/unify the PageLoadClient interfaces + https://bugs.webkit.org/show_bug.cgi?id=46043 + + * MiniBrowser/mac/BrowserWindowController.m: + (didStartProvisionalLoadForFrame): + (didReceiveServerRedirectForProvisionalLoadForFrame): + (didFailProvisionalLoadWithErrorForFrame): + (didCommitLoadForFrame): + (didFinishDocumentLoadForFrame): + (didFinishLoadForFrame): + (didFailLoadWithErrorForFrame): + (didReceiveTitleForFrame): + (didFirstLayoutForFrame): + (didFirstVisuallyNonEmptyLayoutForFrame): + * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp: + (WTR::InjectedBundlePage::InjectedBundlePage): + (WTR::InjectedBundlePage::didStartProvisionalLoadForFrame): + (WTR::InjectedBundlePage::didReceiveServerRedirectForProvisionalLoadForFrame): + (WTR::InjectedBundlePage::didFailProvisionalLoadWithErrorForFrame): + (WTR::InjectedBundlePage::didCommitLoadForFrame): + (WTR::InjectedBundlePage::didFinishLoadForFrame): + (WTR::InjectedBundlePage::didFinishDocumentLoadForFrame): + (WTR::InjectedBundlePage::didFailLoadWithErrorForFrame): + (WTR::InjectedBundlePage::didReceiveTitleForFrame): + * WebKitTestRunner/InjectedBundle/InjectedBundlePage.h: + * WebKitTestRunner/TestController.cpp: + (WTR::TestController::didReceiveMessageFromInjectedBundle): + (WTR::TestController::didFinishLoadForFrame): + * WebKitTestRunner/TestController.h: + +2010-09-17 Eric Seidel <eric@webkit.org> + + Unreviewed. Adding a shell script I use to run the + commit-queue. Now that multiple machines run the cq, + it makes sense to share the script between them. + + * EWSTools/start-commit-queue.sh: Added. + +2010-09-17 Brian Weinstein <bweinstein@apple.com> + + Reviewed by Jon Honeycutt. + + The colors on the new build.webkit.org (after upgrading the master to 0.8.1) are + slightly harder to read, so this reverts the previous background colors for various + states, making it easier to read. + + * BuildSlaveSupport/build.webkit.org-config/public_html/default.css: + (.success): + (.failure): + (.warnings): + (.exception): + (.start,.running,td.building): + (.offline,td.offline): + +2010-09-17 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r67692. + http://trac.webkit.org/changeset/67692 + https://bugs.webkit.org/show_bug.cgi?id=46011 + + broke layout test dashboard (Requested by johnny_g on + #webkit). + + * Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py: + * Scripts/webkitpy/layout_tests/layout_package/json_results_generator_unittest.py: + * Scripts/webkitpy/layout_tests/run_webkit_tests.py: + +2010-09-17 Martin Robinson <mrobinson@igalia.com> + + Reviewed by Oliver Hunt. + + Style bot complains about cairo forward declaration naming + https://bugs.webkit.org/show_bug.cgi?id=45867 + + Exclude Cairo forward declarations from indentifiers with underscores checks. + + * Scripts/webkitpy/style/checkers/cpp.py: Add exclusion for Cairo forward-declarations. + * Scripts/webkitpy/style/checkers/cpp_unittest.py: Add some tests for this. + +2010-09-16 Kinuko Yasuda <kinuko@chromium.org> + + Reviewed by Ojan Vafai. + + Include detailed test modifiers (e.g. FLAKY) in results.json for failing non-layout tests + https://bugs.webkit.org/show_bug.cgi?id=45408 + + This change also tries to remove duplicated upload_results_json methods + in run_webkit_tests.py and json_results_generator.py. + + * Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py: + * Scripts/webkitpy/layout_tests/layout_package/json_results_generator_unittest.py: + * Scripts/webkitpy/layout_tests/run_webkit_tests.py: + +2010-09-16 Antonio Gomes <tonikitoo@webkit.org> + + Reviewed by Andreas Kling. + + [Qt] When switching views (WebViewGraphicsBased <--> WebViewTraditional), QWebPage signals and QActions have to be re-set. + + Recently r67554 changed the way different views use the WebPage class: it was previously being shared between + different views, but now for each view switch, a new WebPage class is constructed and set. Signals and QAction's + were not being set to the new WebPage though. Patch fix that, by re constructing the toolbar, and then re-hooking + all page specific stuff to the UI. + + * QtTestBrowser/launcherwindow.cpp: + (LauncherWindow::initializeView): + * QtTestBrowser/mainwindow.cpp: + (MainWindow::MainWindow): + (MainWindow::buildUI): + (MainWindow::setPage): + * QtTestBrowser/mainwindow.h: + +2010-09-12 Antonio Gomes <tonikitoo@webkit.org> + + Reviewed by Andreas Kling. + + Make all accesses to m_item (GraphicsWebView) done by WebViewGraphicsBased class happen though graphicsWebView getter method. + + This patch is mostly a preparation for another commit, where the ownership of the m_item/GraphicsWebView + object will move to the qgraphicsscene instead of the qgraphicsview. + + * QtTestBrowser/webview.cpp: + (WebViewGraphicsBased::setPage): + (WebViewGraphicsBased::setResizesToContents): + (WebViewGraphicsBased::resizeEvent): + (WebViewGraphicsBased::animatedFlip): + * QtTestBrowser/webview.h: + (WebViewGraphicsBased::setItemCacheMode): + (WebViewGraphicsBased::itemCacheMode): + +2010-09-12 Antonio Gomes <tonikitoo@webkit.org> + + Reviewed by Andreas Kling. + + Moved setYRotation method body out of the class (WebViewGraphicsBased) definition. + + We usually separate methods whose body are larger than a few lines from the class definition. + + * QtTestBrowser/webview.h: + (WebViewGraphicsBased::yRotation): + (WebViewGraphicsBased::setYRotation): + +2010-09-12 Antonio Gomes <tonikitoo@webkit.org> + + Reviewed by Andreas Kling. + + Make initializeView method of LauncherWindow private. + + No one else needs to be able to call it but LauncherWindow. + Also moving the declation of isGraphicsBased method down in the same file, in order + to better group related methods. + + * QtTestBrowser/launcherwindow.h: + +2010-09-12 Antonio Gomes <tonikitoo@webkit.org> + + Reviewed by Andreas Kling. + + Make the getter 'page' method of MainWindow const. + + * QtTestBrowser/mainwindow.cpp: + (MainWindow::page): + * QtTestBrowser/mainwindow.h: + +2010-09-12 Antonio Gomes <tonikitoo@webkit.org> + + Reviewed by Andreas Kling. + + Remove useless parameter from MainWindow class' constructor. + + The parameter defaults to an empty URL and is not being used by any caller. Apart from that it is also + not referred in the constructor body and does not make much sense. + + * QtTestBrowser/mainwindow.cpp: + (MainWindow::MainWindow): + * QtTestBrowser/mainwindow.h: + +2010-09-15 Tony Chang <tony@chromium.org> + + Reviewed by Kent Tamura. + + [Chromium] Needs DRT queueLoadHTMLString and setDeferMainResourceLoad-implementations + https://bugs.webkit.org/show_bug.cgi?id=42151 + + * DumpRenderTree/chromium/LayoutTestController.cpp: + (LayoutTestController::LayoutTestController): + (WorkItemLoadHTMLString::WorkItemLoadHTMLString): + (WorkItemLoadHTMLString::run): + (LayoutTestController::queueLoadHTMLString): + (LayoutTestController::reset): + (LayoutTestController::setDeferMainResourceDataLoad): + * DumpRenderTree/chromium/LayoutTestController.h: + (LayoutTestController::deferMainResourceDataLoad): + * DumpRenderTree/chromium/WebViewHost.cpp: + (WebViewHost::didCreateDataSource): + +2010-09-16 Adrienne Walker <enne@google.com> + + Reviewed by Kenneth Russell. + + Add script to synchronize WebKit and Khronos WebGL tests + https://bugs.webkit.org/show_bug.cgi?id=42336 + + * Scripts/update-webgl-conformance-tests: Added. + * Scripts/webkitpy/layout_tests/update_webgl_conformance_tests.py: Added. + * Scripts/webkitpy/layout_tests/update_webgl_conformance_tests_unittest.py: Added. + +2010-09-16 Sam Weinig <sam@webkit.org> + + Reviewed by Anders Carlsson. + + Add support for sending synchronous messages from the InjectedBundle to the WKContext + <rdar://problem/8365320> + https://bugs.webkit.org/show_bug.cgi?id=44785 + + * MiniBrowser/mac/AppDelegate.m: + (didReceiveSynchronousMessageFromInjectedBundle): + (-[BrowserAppDelegate init]): + * MiniBrowser/mac/WebBundle/WebBundleMain.m: + (didCreatePage): + * WebKitTestRunner/TestController.cpp: + (WTR::TestController::initialize): + +2010-09-16 Leonid Ebril <leonid.ebril@nokia.com> + + Reviewed by Andreas Kling. + + [Qt] QtTestBrowser: Disable creation of a new window for screenshot on Symbian platform. + https://bugs.webkit.org/show_bug.cgi?id=45885 + + Avoid creation of an additional window for screenshot to prevent overlapping with original window. + + * QtTestBrowser/launcherwindow.cpp: + (LauncherWindow::screenshot): + +2010-09-16 Anders Carlsson <andersca@apple.com> + + Fix clang++ build. + + * MiniBrowser/mac/BrowserWindowController.m: + (-[BrowserWindowController zoomIn:]): + (-[BrowserWindowController zoomOut:]): + (-[BrowserWindowController resetZoom:]): + Remove trailing semicolons. + +2010-09-16 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r67628. + http://trac.webkit.org/changeset/67628 + https://bugs.webkit.org/show_bug.cgi?id=45904 + + broke the build (Requested by eric_carlson on #webkit). + + * DumpRenderTree/gtk/EventSender.cpp: + (contextClickCallback): + +2010-09-16 Balazs Kelemen <kbalazs@webkit.org> + + Unreviewed. + + Adding myself as a comitter. + + * Scripts/webkitpy/common/config/committers.py: + +2010-09-15 Philippe Normand <pnormand@igalia.com> + + Reviewed by Eric Carlson. + + [GTK] enhanced context menu for media elements + https://bugs.webkit.org/show_bug.cgi?id=45021 + + EventSender::contextClick() now returns an array of js + objects. Each object has a title property and a click() method. + + * DumpRenderTree/gtk/EventSender.cpp: + (getMenuItemTitleCallback): + (setMenuItemTitleCallback): + (menuItemClickCallback): + (getMenuItemClass): + (contextClickCallback): + +2010-09-14 Philippe Normand <pnormand@igalia.com> + + Reviewed by Eric Carlson and Martin Robinson. + + [GTK] eventSender.contextClick() should return the contents of the context menu + https://bugs.webkit.org/show_bug.cgi?id=39102 + + Make the eventSender use the new private WebKitGtk+ API to + retrieve the context-menu item titles and store them in an array. + + * DumpRenderTree/gtk/EventSender.cpp: + (contextClickCallback): + +2010-09-16 Eric Uhrhane <ericu@chromium.org> + + Reviewed by Jian Li. + + Unify FILE_SYSTEM and FILE_WRITER enables under the name FILE_SYSTEM. + https://bugs.webkit.org/show_bug.cgi?id=45798 + + * Scripts/build-webkit: + +2010-09-16 Robert Hogan <robert@webkit.org> + + Reviewed by Antonio Gomes. + + [Qt] Support globalhistory tests + https://bugs.webkit.org/show_bug.cgi?id=45774 + + * DumpRenderTree/qt/DumpRenderTreeQt.cpp: + (WebCore::isGlobalHistoryTest): + (WebCore::DumpRenderTree::open): + * DumpRenderTree/qt/LayoutTestControllerQt.cpp: + (LayoutTestController::reset): + (LayoutTestController::dumpHistoryCallbacks): + (LayoutTestController::removeAllVisitedLinks): + * DumpRenderTree/qt/LayoutTestControllerQt.h: + +2010-09-10 Tony Chang <tony@chromium.org> + + Reviewed by Eric Seidel. + + deduplicate-tests should be runnable from any WebKit directory + https://bugs.webkit.org/show_bug.cgi?id=44709 + + * Scripts/webkitpy/layout_tests/deduplicate_tests.py: + * Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py: + +2010-09-15 Tony Chang <tony@chromium.org> + + Reviewed by Kent Tamura. + + [chromium] sort testing methods in DRT + https://bugs.webkit.org/show_bug.cgi?id=45850 + + * DumpRenderTree/chromium/EventSender.cpp: + (EventSender::EventSender): + * DumpRenderTree/chromium/LayoutTestController.cpp: + (LayoutTestController::LayoutTestController): + * DumpRenderTree/chromium/TextInputController.cpp: + (TextInputController::TextInputController): + +2010-09-15 Mihai Parparita <mihaip@chromium.org> + + Reviewed by Adam Barth. + + CQ status shows items out of order + https://bugs.webkit.org/show_bug.cgi?id=45846 + + Only group consecutive status items with the same patch ID into the same + group, so that overall item ordering is preserved. + + Also don't indent status items that only have a single item in their + group. + + * QueueStatusServer/handlers/queuestatus.py: + * QueueStatusServer/templates/includes/singlequeuestatus.html: Added. + * QueueStatusServer/templates/queuestatus.html: + +2010-09-15 Eric Seidel <eric@webkit.org> + + Reviewed by Adam Barth. + + Add queue start/stop messages + https://bugs.webkit.org/show_bug.cgi?id=45853 + + I ended up needing to clean up a bunch of our unit testing + in order to test this new code path nicely. + + There are also a few PEP8 changes needed to pass check-webkit-style. + + * Scripts/webkitpy/tool/bot/queueengine.py: + * Scripts/webkitpy/tool/bot/queueengine_unittest.py: + * Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py: + * Scripts/webkitpy/tool/commands/queues.py: + * Scripts/webkitpy/tool/commands/queues_unittest.py: + * Scripts/webkitpy/tool/commands/queuestest.py: + * Scripts/webkitpy/tool/commands/sheriffbot_unittest.py: + +2010-09-15 Simon Fraser <simon.fraser@apple.com> + + https://bugs.webkit.org/show_bug.cgi?id=45849 + WKURLCreateWithCFURL crashes with null url + + Fix MiniBrowser crash when the url is not parseable. + + * MiniBrowser/mac/BrowserWindowController.m: + (-[BrowserWindowController fetch:]): + +2010-09-15 Patrick Gansterer <paroga@paroga.com> + + Unreviewed. + + Adding myself to the committers list. + + * Scripts/webkitpy/common/config/committers.py: + +2010-09-14 Eric Seidel <eric@webkit.org> + + Reviewed by Adam Barth. + + Make it possible to run more than one commit-queue instance + https://bugs.webkit.org/show_bug.cgi?id=45786 + + Mostly we need to make sure the two (or more) instances get + different patches to work on. To do this, I re-worked + the code responsible for getting the next work item to + round trip through the status server. The status server only + vends patches from the work items list, only if those patches + have not had status reported for them in the last hour. + + This is another step towards making all queues go through the + status server, thus making it possible to run more than one + instance of various EWS bots (as requested in bug 44292). + + The webkitpy changes are already covered by existing unit tests. + The QueueStatusSever sadly has no testing infrastructure yet. :( + + * QueueStatusServer/handlers/nextpatch.py: Added. + * QueueStatusServer/index.yaml: + * QueueStatusServer/main.py: + * Scripts/webkitpy/tool/commands/queues.py: + +2010-09-15 Mihai Parparita <mihaip@chromium.org> + + Reviewed by Tony Chang. + + NRWT fails with UnicodeDecodeError on editing/selection/mixed-editability-10.html + https://bugs.webkit.org/show_bug.cgi?id=45791 + + Force filenames to be raw bytes before running difflib.unified_diff. + + * Scripts/webkitpy/layout_tests/port/base.py: + * Scripts/webkitpy/layout_tests/port/base_unittest.py: + +2010-09-15 Simon Hausmann <simon.hausmann@nokia.com> + + Reviewed by Tor Arne Vestbø. + + [Qt] QtTestBrowser crashes when enabling QGraphicsView mode after first loading page without it enabled + https://bugs.webkit.org/show_bug.cgi?id=35247 + + The main issue when changing the views is that the plugins and any other components that + depend on view specific attributes such as the native window id are not teared down. + Even if we had a tear-down procedure, we'd have to re-initialize the plugin after + switching to the new view (QGraphicsWebView). This is a rather uncommon situation, so + we decided to work around this in QtTestBrowser by making toggling between QWebView + and QGraphicsWebView also re-create the page. + + * QtTestBrowser/launcherwindow.cpp: + (LauncherWindow::initializeView): + * QtTestBrowser/mainwindow.h: + +2010-09-14 Mihai Parparita <mihaip@chromium.org> + + Reviewed by Adam Barth. + + Send webkit accessibility notifications to Chromium + https://bugs.webkit.org/show_bug.cgi?id=45156 + + Move printf inside shouldDumpAccessibilityNotifications check. + + * DumpRenderTree/chromium/WebViewHost.cpp: + (WebViewHost::postAccessibilityNotification): + +2010-09-14 Tony Chang <tony@chromium.org> + + Reviewed by Kent Tamura. + + [chromium] fix http/tests/security/local-user-CSS-from-remote.html + https://bugs.webkit.org/show_bug.cgi?id=45788 + + * DumpRenderTree/chromium/LayoutTestController.cpp: + (LayoutTestController::setUserStyleSheetLocation): use a base64 url like in Chrome + +2010-09-14 Tony Chang <tony@chromium.org> + + Reviewed by Ojan Vafai. + + [chromium] Remove WebKit::areLayoutTestImagesOpaque since it's no longer needed + https://bugs.webkit.org/show_bug.cgi?id=45768 + + * DumpRenderTree/chromium/TestShell.cpp: + (TestShell::dumpImage): new baselines are checked in and Linux will match Windows going forward. + +2010-09-14 Kevin Ollivier <kevino@theolliviers.com> + + [wx] Build fix, add newly added directories to the directory list. + + * wx/build/settings.py: + +2010-09-14 Sam Weinig <sam@webkit.org> + + Reviewed by Anders Carlsson. + + Remove WKBundleNodeRef, replacing uses with WKBundleNodeHandleRef. + https://bugs.webkit.org/show_bug.cgi?id=45785 + + * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp: + (WTR::propertyValue): + (WTR::numericWindowPropertyValue): + (WTR::dumpPath): + (WTR::toStr): + (WTR::operator<<): + (WTR::InjectedBundlePage::InjectedBundlePage): + (WTR::InjectedBundlePage::shouldInsertNode): + (WTR::InjectedBundlePage::shouldBeginEditing): + (WTR::InjectedBundlePage::shouldEndEditing): + (WTR::InjectedBundlePage::shouldInsertText): + (WTR::InjectedBundlePage::shouldDeleteRange): + (WTR::InjectedBundlePage::shouldChangeSelectedRange): + (WTR::InjectedBundlePage::shouldApplyStyle): + * WebKitTestRunner/InjectedBundle/InjectedBundlePage.h: + +2010-09-14 Adam Barth <abarth@webkit.org> + + Fix two typos in commit-queue. The first is harmless. The second + causes the queue to reject patches when the build is broken. :( + + * Scripts/webkitpy/tool/commands/queues.py: + * Scripts/webkitpy/tool/commands/queues_unittest.py: + +2010-09-14 Chris Guillory <chris.guillory@google.com> + + Reviewed by Chris Fleizach. + + Send all accessibility notifications to Chromium. + https://bugs.webkit.org/show_bug.cgi?id=45156 + + * DumpRenderTree/chromium/WebViewHost.cpp: + (WebViewHost::postAccessibilityNotification): + * DumpRenderTree/chromium/WebViewHost.h: + +2010-09-14 Adam Barth <abarth@webkit.org> + + Reviewed by Eric Seidel. + + commit-queue is slow during the day + https://bugs.webkit.org/show_bug.cgi?id=45780 + + Thanks to the new logging, we've noticed that checkout-is-out-of-date + errors in the first pass of landing don't retry the land. Instead, + they're treated as failures and cause the commit-queue to do two more + builds before really trying to land the patch. Worse, in the second + build, we can get bitten by a flaky test. + + This patch takes a slightly different approach to the commit-queue's + main control logic. We now use a separate subprocess for building and + testing and for landing. This means we should very rarely see the + checkout-is-out-of-date error, and when we do see it, we should retry + more quickly. If my understanding is correct, this should be a big + speed win for the commit-queue. + + * Scripts/webkitpy/tool/commands/download.py: + * Scripts/webkitpy/tool/commands/queues.py: + * Scripts/webkitpy/tool/commands/queues_unittest.py: + +2010-09-14 Tony Chang <tony@chromium.org> + + Reviewed by Dimitri Glazkov. + + [chromium] implement layoutTestController.setDomainRelaxationForbiddenForURLScheme + https://bugs.webkit.org/show_bug.cgi?id=45762 + + * DumpRenderTree/chromium/LayoutTestController.cpp: + (LayoutTestController::LayoutTestController): + (LayoutTestController::setDomainRelaxationForbiddenForURLScheme): + * DumpRenderTree/chromium/LayoutTestController.h: + +2010-09-14 Csaba Osztrogonác <ossy@webkit.org> + + Adding myself as a reviewer. + + * Scripts/webkitpy/common/config/committers.py: + +2010-09-14 Zoltan Horvath <zoltan@webkit.org> + + Reviewed by Kenneth Rohde Christiansen. + + [Qt] Build-webkit shows a warning when WebKitBuild directory is not exist + https://bugs.webkit.org/show_bug.cgi?id=45736 + + Build-webkit has showed a warning when WebKitBuild didn't exist, add + an additional condition to avoid it. + + * Scripts/build-webkit: + +2010-09-13 Eric Seidel <eric@webkit.org> + + Reviewed by Adam Barth. + + commit-queue should log when it's retrying due to checkout out of date error + https://bugs.webkit.org/show_bug.cgi?id=45725 + + This will allow us to better track how often we see these errors + and how long it takes the queue to recover from them. + + In order to pass the tests, I had to correct an error + from a previous change. The UnitTestPort should not have + ever been using the base port method as that will read + a file from disk. If the unit tests haven't passed the contents + it should raise an IOError as though the file doesn't exist. + + * Scripts/webkitpy/layout_tests/port/base_unittest.py: + * Scripts/webkitpy/tool/commands/queues.py: + * Scripts/webkitpy/tool/commands/queues_unittest.py: + +2010-09-13 Mihai Parparita <mihaip@chromium.org> + + Reviewed by Adam Barth. + + Upload results when cq patch landing fails + https://bugs.webkit.org/show_bug.cgi?id=45683 + + Include script errors when CommitQueue._land fails. + + * Scripts/webkitpy/tool/commands/queues.py: + +2010-09-13 Chris Fleizach <cfleizach@apple.com> + + Reviewed by David Kilzer. + + AX: accessibilityIsIgnored is returning nil when return value expects a BOOL + https://bugs.webkit.org/show_bug.cgi?id=45548 + + * DumpRenderTree/AccessibilityUIElement.cpp: + (isIgnoredCallback): + (AccessibilityUIElement::getJSClass): + * DumpRenderTree/AccessibilityUIElement.h: + * DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp: + (AccessibilityUIElement::isIgnored): + * DumpRenderTree/mac/AccessibilityUIElementMac.mm: + (AccessibilityUIElement::isIgnored): + * DumpRenderTree/win/AccessibilityUIElementWin.cpp: + (AccessibilityUIElement::isIgnored): + +2010-09-13 Csaba Osztrogonác <ossy@webkit.org> + + Reviewed by Andreas Kling. + + jscPath() is incorrect in Windows' cmd.exe shell + https://bugs.webkit.org/show_bug.cgi?id=45651 + + * Scripts/webkitdirs.pm: Add ".exe" suffix to $jscName on Windows. + +2010-09-13 Chris Fleizach <cfleizach@apple.com> + + Reviewed by Darin Adler. + + REGRESSION (r64816-r64889): Crash in WebCore::AccessibilityRenderObject + https://bugs.webkit.org/show_bug.cgi?id=43807 + + * DumpRenderTree/AccessibilityUIElement.cpp: + (textMarkerForPointCallback): + (AccessibilityUIElement::textMarkerForPoint): + (AccessibilityUIElement::getJSClass): + * DumpRenderTree/AccessibilityUIElement.h: + * DumpRenderTree/mac/AccessibilityUIElementMac.mm: + (AccessibilityUIElement::textMarkerForPoint): + +2010-09-13 Andreas Kling <andreas.kling@nokia.com> + + Reviewed by Kenneth Rohde Christiansen. + + [Qt] build-webkit: Add --v8 option to build against V8 + + Note that V8 is picked up from QtScript, so this currently requires building + against the experimental qt-script-v8 branch. + + * Scripts/build-webkit: + +2010-09-13 Hans Wennborg <hans@chromium.org> + + Reviewed by Jeremy Orlow. + + Add WebDeviceOrientationClientMock::create() and use it from DRT. + https://bugs.webkit.org/show_bug.cgi?id=45650 + + Do not use the WebDeviceOrientationClientMock constructor directly, + but use the create() member function. + + This should fix the linker errors for the multi-DLL Chromium DRT build. + + * DumpRenderTree/chromium/LayoutTestController.cpp: + (LayoutTestController::setMockDeviceOrientation): + (LayoutTestController::deviceOrientationClient): + +2010-08-27 Kenneth Rohde Christiansen <kenneth.christiansen@openbossa.org> + + Reviewed by Antti Koivisto. + + Add support for testing the viewport meta tag algorithm, + based on the following draft spec: + + http://people.opera.com/rune/TR/ED-css-viewport-20100806/ + + Add common handling of viewport meta tag based on new Opera spec + https://bugs.webkit.org/show_bug.cgi?id=44201 + + * DumpRenderTree/qt/LayoutTestControllerQt.cpp: + (LayoutTestController::dumpConfigurationForViewport): + * DumpRenderTree/qt/LayoutTestControllerQt.h: + +2010-09-12 Kent Tamura <tkent@chromium.org> + + Reviewed by Tony Chang. + + [DRT/Chromium] Remove dependency to base/string16.h and gfx/codec/png_codec.h + https://bugs.webkit.org/show_bug.cgi?id=45517 + + Use webkit_support_gfx.h for PNG encoding/decoding instead of png_codec.h + + * DumpRenderTree/chromium/ImageDiff.cpp: + (Image::craeteFromStdin): + (Image::createFromFilename): + (diffImages): + * DumpRenderTree/chromium/TestShell.cpp: + (TestShell::dumpImage): + +2010-09-10 MORITA Hajime <morrita@google.com> + + Reviewed by Tony Chang. + + [Chromium] Implement textInputController.hasSpellingMarker() for Chromium + https://bugs.webkit.org/show_bug.cgi?id=45441 + + Added TextInputController::hasSpellingMarker(). + + * DumpRenderTree/chromium/TextInputController.cpp: + (TextInputController::TextInputController): + (TextInputController::hasSpellingMarker): + * DumpRenderTree/chromium/TextInputController.h: + +2010-09-12 Dirk Pranke <dpranke@chromium.org> + + Unreviewed, build fix. + + My last change accidentally contained a local change to the + rebaselinig script; webkit-patch land picked it up without telling + me and committed it :( + + * Scripts/webkitpy/layout_tests/rebaseline_chromium_webkit_tests.py: + +2010-09-11 Maciej Stachowiak <mjs@apple.com> + + Reviewed by Anders Carlsson. + + Attempt to fix Windows MiniBrowser build (untested) + https://bugs.webkit.org/show_bug.cgi?id=45609 + + * MiniBrowser/win/BrowserView.cpp: + (runJavaScriptConfirm): + (runJavaScriptPrompt): + +2010-09-11 Sam Weinig <sam@webkit.org> + + Reviewed by Maciej Stachowiak. + + Fix zoom related tests when testing WebKit2. + + * WebKitTestRunner/InjectedBundle/EventSendingController.cpp: + (WTR::EventSendingController::zoomPageIn): Zoom in and zoom out are not the same. + +2010-09-11 Sam Weinig <sam@webkit.org> + + Reviewed by Dan Bernstein. + + Implement WebKit2 callback equivalent to - [WebUIDelegate webView:setStatusText:] + <rdar://problem/8359252> + https://bugs.webkit.org/show_bug.cgi?id=45605 + + * MiniBrowser/mac/BrowserWindowController.m: + (setStatusText): + (contentsSizeChanged): + (-[BrowserWindowController awakeFromNib]): + * MiniBrowser/win/BrowserView.cpp: + (runJavaScriptConfirm): + (runJavaScriptPrompt): + (setStatusText): + (contentsSizeChanged): + (BrowserView::create): + * WebKitTestRunner/TestController.cpp: + (WTR::createOtherPage): + (WTR::TestController::initialize): + +2010-09-11 Sam Weinig <sam@webkit.org> + + Reviewed by Dan Bernstein. + + Add callback mechanism for the getting the source of a frame + <rdar://problem/8364681> + https://bugs.webkit.org/show_bug.cgi?id=45604 + + Add ability to dump the main frame's source to the console. + + * MiniBrowser/mac/BrowserWindowController.h: + * MiniBrowser/mac/BrowserWindowController.m: + (-[BrowserWindowController dumpSourceToConsole:]): + * MiniBrowser/mac/MainMenu.xib: + +2010-09-11 Eric Seidel <eric@webkit.org> + + Reviewed by Adam Barth. + + Remove unneeded Empty Queue messages + https://bugs.webkit.org/show_bug.cgi?id=45602 + + We already have a /gc job to delete these. + recentstatus.py is already smart enough to use the + most recent of the workitems last update or the most recent status, + so removing these should not change the _last_status_date() return + value more than a few milliseconds. + + These messages just spam the recent status log. + + * Scripts/webkitpy/tool/commands/queues.py: + +2010-09-11 Mihai Parparita <mihaip@chromium.org> + + Reviewed by Adam Barth. + + Fix Python exception when generating synthetic patch IDs + https://bugs.webkit.org/show_bug.cgi?id=45592 + + Can't concatenate strings and numbers directly. + + * QueueStatusServer/handlers/queuestatus.py: + +2010-09-11 Mihai Parparita <mihaip@chromium.org> + + Reviewed by Adam Barth. + + Group statuses in queue status by patch ID + https://bugs.webkit.org/show_bug.cgi?id=45588 + + Group statuses by patch ID so that the status page is easier + to scan. + + * QueueStatusServer/handlers/queuestatus.py: + * QueueStatusServer/stylesheets/dashboard.css: + (.status-group): + (.status-bug): + (.status-group ul): + (.status-group ul li): + (.status-group ul li:hover): + (.status-cell): + (.status-cell:hover): + (.status-cell.pass): + (.status-cell.fail): + (.status-cell.pending): + (.status-cell.error): + * QueueStatusServer/templates/dashboard.html: + * QueueStatusServer/templates/queuestatus.html: + +2010-09-11 Mihai Parparita <mihaip@chromium.org> + + Reviewed by Tony Chang. + + Implement layoutTestController.dumpResourceResponseMIMETypes in Chromium DRT + https://bugs.webkit.org/show_bug.cgi?id=45479 + + Implement layoutTestController.dumpResourceResponseMIMETypes (modelled after + implementation in ResourceLoadDelegate in the Mac port). + + * DumpRenderTree/chromium/LayoutTestController.cpp: + (LayoutTestController::LayoutTestController): + (LayoutTestController::dumpResourceResponseMIMETypes): + (LayoutTestController::reset): + * DumpRenderTree/chromium/LayoutTestController.h: + (LayoutTestController::setShouldDumpResourceResponseMIMETypes): + (LayoutTestController::shouldDumpResourceResponseMIMETypes): + * DumpRenderTree/chromium/TestShell.h: + (TestShell::shouldDumpResourceResponseMIMETypes): + * DumpRenderTree/chromium/WebViewHost.cpp: + (WebViewHost::didReceiveResponse): + +2010-09-11 Eric Seidel <eric@webkit.org> + + Reviewed by Adam Barth. + + queues.webkit.org should expose /remote_api for data upload/download + https://bugs.webkit.org/show_bug.cgi?id=45559 + + * QueueStatusServer/app.yaml: + - /remote_api is a standard app-engine service which allows use of + the bulk uploader for data upload/download. Exposing this + (for admin access only) allows us to use + +2010-09-10 Sam Weinig <sam@webkit.org> + + Reviewed by Dan Bernstein. + + Add zoom support to WebKit2 API + <rdar://problem/7660657> + https://bugs.webkit.org/show_bug.cgi?id=45585 + + - Add zoom options to MiniBrowser that mimic Safari's options using + the new WebKit2 zoom APIs. + - Switch uses of float for the zoom APIs to use double. + + * MiniBrowser/mac/BrowserWindowController.h: + * MiniBrowser/mac/BrowserWindowController.m: + (-[BrowserWindowController initWithPageNamespace:]): + (-[BrowserWindowController validateMenuItem:]): + (-[BrowserWindowController validateUserInterfaceItem:]): + (-[BrowserWindowController currentZoomFactor]): + (-[BrowserWindowController setCurrentZoomFactor:]): + (-[BrowserWindowController canZoomIn]): + (-[BrowserWindowController zoomIn:]): + (-[BrowserWindowController canZoomOut]): + (-[BrowserWindowController zoomOut:]): + (-[BrowserWindowController canResetZoom]): + (-[BrowserWindowController resetZoom:]): + (-[BrowserWindowController toggleZoomMode:]): + * MiniBrowser/mac/MainMenu.xib: + * WebKitTestRunner/InjectedBundle/EventSendingController.cpp: + (WTR::EventSendingController::textZoomIn): + (WTR::EventSendingController::textZoomOut): + (WTR::EventSendingController::zoomPageIn): + (WTR::EventSendingController::zoomPageOut): + +2010-09-10 Robert Hogan <robert@webkit.org> + + Reviewed by Andreas Kling. + + [Qt] Fix crash in DRT in standalone mode + + https://bugs.webkit.org/show_bug.cgi?id=45454 + + * DumpRenderTree/qt/DumpRenderTreeQt.cpp: + (WebCore::DumpRenderTree::loadNextTestInStandAloneMode): + +2010-09-10 Sam Weinig <sam@webkit.org> + + Reviewed by Darin Adler. + + Remove unnecessary constraint in WebCore of choosing either text zoom or full page zoom. + Precursor to <rdar://problem/7660657> + https://bugs.webkit.org/show_bug.cgi?id=45522 + + Update for changes to the Bundle API to allow separate control of page and text zoom + levels. + + * WebKitTestRunner/InjectedBundle/EventSendingController.cpp: + (WTR::EventSendingController::textZoomIn): + (WTR::EventSendingController::textZoomOut): + (WTR::EventSendingController::zoomPageIn): + (WTR::EventSendingController::zoomPageOut): + * WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp: + (WTR::InjectedBundlePage::reset): + +2010-09-10 Yael Aharon <yael.aharon@nokia.com> + + Reviewed by Andreas Kling. + + [Qt] Support click event for notifications + https://bugs.webkit.org/show_bug.cgi?id=44836 + + Add support for simulateDesktopNotificationClick by calling + back to DumpRenderTreeSupportQt.cpp. + + * DumpRenderTree/qt/LayoutTestControllerQt.cpp: + (LayoutTestController::simulateDesktopNotificationClick): + * DumpRenderTree/qt/LayoutTestControllerQt.h: + +2010-09-10 Mihai Parparita <mihaip@chromium.org> + + Reviewed by Eric Seidel. + + Update queue status when patches fail their first land attempt + https://bugs.webkit.org/show_bug.cgi?id=45583 + + Add a few more _update_status calls to make it more obvious if a patch is + being retried because tests failed. + + * Scripts/webkitpy/tool/commands/queues.py: + +2010-09-10 Balazs Kelemen <kb@inf.u-szeged.hu> + + Reviewed by Andreas Kling. + + [Qt] MiniBrowser crashes with multiply windows when closing one of them + https://bugs.webkit.org/show_bug.cgi?id=45536 + + * MiniBrowser/qt/BrowserView.cpp: + (BrowserView::BrowserView): Reference the context instead of adopting it + because it can be shared across different views. + +2010-09-10 Tony Chang <tony@chromium.org> + + Unreviewed, rolling out r67241. + http://trac.webkit.org/changeset/67241 + https://bugs.webkit.org/show_bug.cgi?id=44709 + + Accidentally committed. + + * Scripts/webkitpy/layout_tests/deduplicate_tests.py: + * Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py: + +2010-09-10 Tony Chang <tony@chromium.org> + + Reviewed by Ojan Vafai. + + deduplicate-tests should be runnable from any WebKit directory + https://bugs.webkit.org/show_bug.cgi?id=44709 + + * Scripts/webkitpy/layout_tests/deduplicate_tests.py: + * Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py: + +2010-09-10 Tony Chang <tony@chromium.org> + + Unreviewed, rolling out r67216. + http://trac.webkit.org/changeset/67216 + https://bugs.webkit.org/show_bug.cgi?id=44709 + + Broke + + * Scripts/webkitpy/layout_tests/deduplicate_tests.py: + * Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py: + +2010-09-10 Tony Chang <tony@chromium.org> + + Reviewed by Ojan Vafai. + + deduplicate-tests should be runnable from any WebKit directory + https://bugs.webkit.org/show_bug.cgi?id=44709 + + * Scripts/webkitpy/layout_tests/deduplicate_tests.py: + * Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py: + 2010-09-09 Hans Wennborg <hans@chromium.org> Reviewed by Jeremy Orlow. diff --git a/WebKitTools/DumpRenderTree/AccessibilityUIElement.cpp b/WebKitTools/DumpRenderTree/AccessibilityUIElement.cpp index 22bbbaa..13c642a 100644 --- a/WebKitTools/DumpRenderTree/AccessibilityUIElement.cpp +++ b/WebKitTools/DumpRenderTree/AccessibilityUIElement.cpp @@ -424,6 +424,18 @@ static JSValueRef textMarkerRangeLengthCallback(JSContextRef context, JSObjectRe return JSValueMakeNumber(context, (int)toAXElement(thisObject)->textMarkerRangeLength(range)); } +static JSValueRef textMarkerForPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) +{ + int x = 0; + int y = 0; + if (argumentCount == 2) { + x = JSValueToNumber(context, arguments[0], exception); + y = JSValueToNumber(context, arguments[1], exception); + } + + return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->textMarkerForPoint(x, y)); +} + static JSValueRef textMarkerRangeForMarkersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { AccessibilityTextMarker* startMarker = 0; @@ -662,6 +674,11 @@ static JSValueRef getIsCollapsedCallback(JSContextRef context, JSObjectRef thisO return JSValueMakeBoolean(context, toAXElement(thisObject)->isCollapsed()); } +static JSValueRef isIgnoredCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*) +{ + return JSValueMakeBoolean(context, toAXElement(thisObject)->isIgnored()); +} + static JSValueRef getHasPopupCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*) { return JSValueMakeBoolean(context, toAXElement(thisObject)->hasPopup()); @@ -752,6 +769,11 @@ AccessibilityUIElement AccessibilityUIElement::accessibilityElementForTextMarker return 0; } +AccessibilityTextMarker AccessibilityUIElement::textMarkerForPoint(int x, int y) +{ + return 0; +} + #endif // Destruction @@ -814,6 +836,7 @@ JSClassRef AccessibilityUIElement::getJSClass() { "orientation", getOrientationCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, { "ariaIsGrabbed", getARIAIsGrabbedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, { "ariaDropEffects", getARIADropEffectsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, + { "isIgnored", isIgnoredCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, { 0, 0, 0, 0 } }; @@ -872,6 +895,7 @@ JSClassRef AccessibilityUIElement::getJSClass() { "endTextMarkerForTextMarkerRange", endTextMarkerForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, { "accessibilityElementForTextMarker", accessibilityElementForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, { "textMarkerRangeLength", textMarkerRangeLengthCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, + { "textMarkerForPoint", textMarkerForPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, { 0, 0, 0 } }; diff --git a/WebKitTools/DumpRenderTree/AccessibilityUIElement.h b/WebKitTools/DumpRenderTree/AccessibilityUIElement.h index 2606795..5170f20 100644 --- a/WebKitTools/DumpRenderTree/AccessibilityUIElement.h +++ b/WebKitTools/DumpRenderTree/AccessibilityUIElement.h @@ -138,6 +138,7 @@ public: bool isVisible() const; bool isOffScreen() const; bool isCollapsed() const; + bool isIgnored() const; bool hasPopup() const; int hierarchicalLevel() const; double clickPointX(); @@ -189,6 +190,7 @@ public: AccessibilityTextMarkerRange textMarkerRangeForMarkers(AccessibilityTextMarker* startMarker, AccessibilityTextMarker* endMarker); AccessibilityTextMarker startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*); AccessibilityTextMarker endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*); + AccessibilityTextMarker textMarkerForPoint(int x, int y); AccessibilityUIElement accessibilityElementForTextMarker(AccessibilityTextMarker*); int textMarkerRangeLength(AccessibilityTextMarkerRange*); diff --git a/WebKitTools/DumpRenderTree/DumpRenderTree.gypi b/WebKitTools/DumpRenderTree/DumpRenderTree.gypi index b39fd2a..58ccaae 100644 --- a/WebKitTools/DumpRenderTree/DumpRenderTree.gypi +++ b/WebKitTools/DumpRenderTree/DumpRenderTree.gypi @@ -39,6 +39,8 @@ 'chromium/TestShellWin.cpp', 'chromium/TextInputController.cpp', 'chromium/TextInputController.h', + 'chromium/WebPreferences.cpp', + 'chromium/WebPreferences.h', 'chromium/WebViewHost.cpp', 'chromium/WebViewHost.h', ], diff --git a/WebKitTools/DumpRenderTree/chromium/EventSender.cpp b/WebKitTools/DumpRenderTree/chromium/EventSender.cpp index c2ba380..5f51553 100644 --- a/WebKitTools/DumpRenderTree/chromium/EventSender.cpp +++ b/WebKitTools/DumpRenderTree/chromium/EventSender.cpp @@ -250,34 +250,34 @@ EventSender::EventSender(TestShell* shell) // they will use when called by JavaScript. The actual binding of those // names to their methods will be done by calling bindToJavaScript() (defined // by CppBoundClass, the parent to EventSender). - bindMethod("mouseDown", &EventSender::mouseDown); - bindMethod("mouseUp", &EventSender::mouseUp); + bindMethod("addTouchPoint", &EventSender::addTouchPoint); + bindMethod("beginDragWithFiles", &EventSender::beginDragWithFiles); + bindMethod("cancelTouchPoint", &EventSender::cancelTouchPoint); + bindMethod("clearKillRing", &EventSender::clearKillRing); + bindMethod("clearTouchPoints", &EventSender::clearTouchPoints); bindMethod("contextClick", &EventSender::contextClick); - bindMethod("mouseMoveTo", &EventSender::mouseMoveTo); - bindMethod("leapForward", &EventSender::leapForward); - bindMethod("keyDown", &EventSender::keyDown); + bindMethod("continuousMouseScrollBy", &EventSender::continuousMouseScrollBy); bindMethod("dispatchMessage", &EventSender::dispatchMessage); bindMethod("enableDOMUIEventLogging", &EventSender::enableDOMUIEventLogging); bindMethod("fireKeyboardEventsToElement", &EventSender::fireKeyboardEventsToElement); - bindMethod("clearKillRing", &EventSender::clearKillRing); - bindMethod("textZoomIn", &EventSender::textZoomIn); - bindMethod("textZoomOut", &EventSender::textZoomOut); - bindMethod("zoomPageIn", &EventSender::zoomPageIn); - bindMethod("zoomPageOut", &EventSender::zoomPageOut); + bindMethod("keyDown", &EventSender::keyDown); + bindMethod("leapForward", &EventSender::leapForward); + bindMethod("mouseDown", &EventSender::mouseDown); + bindMethod("mouseMoveTo", &EventSender::mouseMoveTo); bindMethod("mouseScrollBy", &EventSender::mouseScrollBy); - bindMethod("continuousMouseScrollBy", &EventSender::continuousMouseScrollBy); - bindMethod("scheduleAsynchronousClick", &EventSender::scheduleAsynchronousClick); - bindMethod("beginDragWithFiles", &EventSender::beginDragWithFiles); - bindMethod("addTouchPoint", &EventSender::addTouchPoint); - bindMethod("cancelTouchPoint", &EventSender::cancelTouchPoint); - bindMethod("clearTouchPoints", &EventSender::clearTouchPoints); + bindMethod("mouseUp", &EventSender::mouseUp); bindMethod("releaseTouchPoint", &EventSender::releaseTouchPoint); - bindMethod("updateTouchPoint", &EventSender::updateTouchPoint); + bindMethod("scheduleAsynchronousClick", &EventSender::scheduleAsynchronousClick); bindMethod("setTouchModifier", &EventSender::setTouchModifier); + bindMethod("textZoomIn", &EventSender::textZoomIn); + bindMethod("textZoomOut", &EventSender::textZoomOut); bindMethod("touchCancel", &EventSender::touchCancel); bindMethod("touchEnd", &EventSender::touchEnd); bindMethod("touchMove", &EventSender::touchMove); bindMethod("touchStart", &EventSender::touchStart); + bindMethod("updateTouchPoint", &EventSender::updateTouchPoint); + bindMethod("zoomPageIn", &EventSender::zoomPageIn); + bindMethod("zoomPageOut", &EventSender::zoomPageOut); // When set to true (the default value), we batch mouse move and mouse up // events so we can simulate drag & drop. diff --git a/WebKitTools/DumpRenderTree/chromium/ImageDiff.cpp b/WebKitTools/DumpRenderTree/chromium/ImageDiff.cpp index d1adc3d..f2875dd 100644 --- a/WebKitTools/DumpRenderTree/chromium/ImageDiff.cpp +++ b/WebKitTools/DumpRenderTree/chromium/ImageDiff.cpp @@ -36,7 +36,7 @@ #include "config.h" -#include "gfx/codec/png_codec.h" +#include "webkit/support/webkit_support_gfx.h" #include <algorithm> #include <stdio.h> #include <string.h> @@ -49,7 +49,6 @@ #define PATH_MAX MAX_PATH #endif -using namespace gfx; using namespace std; // Causes the app to remain open, waiting for pairs of filenames on stdin. @@ -93,8 +92,7 @@ public: if (fread(source.get(), 1, byteLength, stdin) != byteLength) return false; - if (!PNGCodec::Decode(source.get(), byteLength, PNGCodec::FORMAT_RGBA, - &m_data, &m_width, &m_height)) { + if (!webkit_support::DecodePNG(source.get(), byteLength, &m_data, &m_width, &m_height)) { clear(); return false; } @@ -118,8 +116,7 @@ public: fclose(f); - if (!PNGCodec::Decode(&compressed[0], compressed.size(), - PNGCodec::FORMAT_RGBA, &m_data, &m_width, &m_height)) { + if (!webkit_support::DecodePNG(&compressed[0], compressed.size(), &m_data, &m_width, &m_height)) { clear(); return false; } @@ -353,8 +350,8 @@ int diffImages(const char* file1, const char* file2, const char* outFile) return statusSame; vector<unsigned char> pngData; - PNGCodec::Encode(diffImage.data(), PNGCodec::FORMAT_RGBA, diffImage.width(), - diffImage.height(), diffImage.width() * 4, false, &pngData); + webkit_support::EncodeRGBAPNG(diffImage.data(), diffImage.width(), diffImage.height(), + diffImage.width() * 4, &pngData); if (!writeFile(outFile, &pngData.front(), pngData.size())) return statusError; return statusDifferent; diff --git a/WebKitTools/DumpRenderTree/chromium/LayoutTestController.cpp b/WebKitTools/DumpRenderTree/chromium/LayoutTestController.cpp index 6f962bf..2c6c600 100644 --- a/WebKitTools/DumpRenderTree/chromium/LayoutTestController.cpp +++ b/WebKitTools/DumpRenderTree/chromium/LayoutTestController.cpp @@ -38,6 +38,7 @@ #include "public/WebAnimationController.h" #include "public/WebBindings.h" #include "public/WebConsoleMessage.h" +#include "public/WebData.h" #include "public/WebDeviceOrientation.h" #include "public/WebDeviceOrientationClientMock.h" #include "public/WebDocument.h" @@ -77,113 +78,112 @@ LayoutTestController::LayoutTestController(TestShell* shell) // they will use when called by JavaScript. The actual binding of those // names to their methods will be done by calling bindToJavaScript() (defined // by CppBoundClass, the parent to LayoutTestController). + bindMethod("addFileToPasteboardOnDrag", &LayoutTestController::addFileToPasteboardOnDrag); + bindMethod("addOriginAccessWhitelistEntry", &LayoutTestController::addOriginAccessWhitelistEntry); + bindMethod("addUserScript", &LayoutTestController::addUserScript); + bindMethod("addUserStyleSheet", &LayoutTestController::addUserStyleSheet); + bindMethod("clearAllDatabases", &LayoutTestController::clearAllDatabases); + bindMethod("closeWebInspector", &LayoutTestController::closeWebInspector); + bindMethod("counterValueForElementById", &LayoutTestController::counterValueForElementById); + bindMethod("disableImageLoading", &LayoutTestController::disableImageLoading); + bindMethod("display", &LayoutTestController::display); bindMethod("dumpAsText", &LayoutTestController::dumpAsText); - bindMethod("dumpChildFrameScrollPositions", &LayoutTestController::dumpChildFrameScrollPositions); + bindMethod("dumpBackForwardList", &LayoutTestController::dumpBackForwardList); bindMethod("dumpChildFramesAsText", &LayoutTestController::dumpChildFramesAsText); + bindMethod("dumpChildFrameScrollPositions", &LayoutTestController::dumpChildFrameScrollPositions); bindMethod("dumpDatabaseCallbacks", &LayoutTestController::dumpDatabaseCallbacks); bindMethod("dumpEditingCallbacks", &LayoutTestController::dumpEditingCallbacks); - bindMethod("dumpBackForwardList", &LayoutTestController::dumpBackForwardList); bindMethod("dumpFrameLoadCallbacks", &LayoutTestController::dumpFrameLoadCallbacks); bindMethod("dumpResourceLoadCallbacks", &LayoutTestController::dumpResourceLoadCallbacks); + bindMethod("dumpResourceResponseMIMETypes", &LayoutTestController::dumpResourceResponseMIMETypes); + bindMethod("dumpSelectionRect", &LayoutTestController::dumpSelectionRect); bindMethod("dumpStatusCallbacks", &LayoutTestController::dumpWindowStatusChanges); bindMethod("dumpTitleChanges", &LayoutTestController::dumpTitleChanges); - bindMethod("setAcceptsEditing", &LayoutTestController::setAcceptsEditing); - bindMethod("waitUntilDone", &LayoutTestController::waitUntilDone); + bindMethod("elementDoesAutoCompleteForElementWithId", &LayoutTestController::elementDoesAutoCompleteForElementWithId); + bindMethod("evaluateInWebInspector", &LayoutTestController::evaluateInWebInspector); + bindMethod("evaluateScriptInIsolatedWorld", &LayoutTestController::evaluateScriptInIsolatedWorld); + bindMethod("execCommand", &LayoutTestController::execCommand); + bindMethod("forceRedSelectionColors", &LayoutTestController::forceRedSelectionColors); + bindMethod("grantDesktopNotificationPermission", &LayoutTestController::grantDesktopNotificationPermission); + bindMethod("isCommandEnabled", &LayoutTestController::isCommandEnabled); + bindMethod("markerTextForListItem", &LayoutTestController::markerTextForListItem); bindMethod("notifyDone", &LayoutTestController::notifyDone); - bindMethod("queueReload", &LayoutTestController::queueReload); - bindMethod("queueLoadingScript", &LayoutTestController::queueLoadingScript); - bindMethod("queueNonLoadingScript", &LayoutTestController::queueNonLoadingScript); - bindMethod("queueLoad", &LayoutTestController::queueLoad); - bindMethod("queueBackNavigation", &LayoutTestController::queueBackNavigation); - bindMethod("queueForwardNavigation", &LayoutTestController::queueForwardNavigation); - bindMethod("windowCount", &LayoutTestController::windowCount); - bindMethod("setCanOpenWindows", &LayoutTestController::setCanOpenWindows); - bindMethod("setCloseRemainingWindowsWhenComplete", &LayoutTestController::setCloseRemainingWindowsWhenComplete); + bindMethod("numberOfActiveAnimations", &LayoutTestController::numberOfActiveAnimations); + bindMethod("numberOfPages", &LayoutTestController::numberOfPages); bindMethod("objCIdentityIsEqual", &LayoutTestController::objCIdentityIsEqual); - bindMethod("setAlwaysAcceptCookies", &LayoutTestController::setAlwaysAcceptCookies); - bindMethod("showWebInspector", &LayoutTestController::showWebInspector); - bindMethod("closeWebInspector", &LayoutTestController::closeWebInspector); - bindMethod("setWindowIsKey", &LayoutTestController::setWindowIsKey); - bindMethod("setTabKeyCyclesThroughElements", &LayoutTestController::setTabKeyCyclesThroughElements); - bindMethod("setUserStyleSheetLocation", &LayoutTestController::setUserStyleSheetLocation); - bindMethod("setUserStyleSheetEnabled", &LayoutTestController::setUserStyleSheetEnabled); - bindMethod("setAuthorAndUserStylesEnabled", &LayoutTestController::setAuthorAndUserStylesEnabled); + bindMethod("overridePreference", &LayoutTestController::overridePreference); + bindMethod("pageNumberForElementById", &LayoutTestController::pageNumberForElementById); bindMethod("pathToLocalResource", &LayoutTestController::pathToLocalResource); - bindMethod("addFileToPasteboardOnDrag", &LayoutTestController::addFileToPasteboardOnDrag); - bindMethod("execCommand", &LayoutTestController::execCommand); - bindMethod("isCommandEnabled", &LayoutTestController::isCommandEnabled); - bindMethod("setPopupBlockingEnabled", &LayoutTestController::setPopupBlockingEnabled); - bindMethod("setStopProvisionalFrameLoads", &LayoutTestController::setStopProvisionalFrameLoads); - bindMethod("setSmartInsertDeleteEnabled", &LayoutTestController::setSmartInsertDeleteEnabled); - bindMethod("setSelectTrailingWhitespaceEnabled", &LayoutTestController::setSelectTrailingWhitespaceEnabled); bindMethod("pauseAnimationAtTimeOnElementWithId", &LayoutTestController::pauseAnimationAtTimeOnElementWithId); bindMethod("pauseTransitionAtTimeOnElementWithId", &LayoutTestController::pauseTransitionAtTimeOnElementWithId); - bindMethod("elementDoesAutoCompleteForElementWithId", &LayoutTestController::elementDoesAutoCompleteForElementWithId); - bindMethod("numberOfActiveAnimations", &LayoutTestController::numberOfActiveAnimations); - bindMethod("suspendAnimations", &LayoutTestController::suspendAnimations); + bindMethod("queueBackNavigation", &LayoutTestController::queueBackNavigation); + bindMethod("queueForwardNavigation", &LayoutTestController::queueForwardNavigation); + bindMethod("queueLoadingScript", &LayoutTestController::queueLoadingScript); + bindMethod("queueLoad", &LayoutTestController::queueLoad); + bindMethod("queueLoadHTMLString", &LayoutTestController::queueLoadHTMLString); + bindMethod("queueNonLoadingScript", &LayoutTestController::queueNonLoadingScript); + bindMethod("queueReload", &LayoutTestController::queueReload); + bindMethod("removeOriginAccessWhitelistEntry", &LayoutTestController::removeOriginAccessWhitelistEntry); + bindMethod("repaintSweepHorizontally", &LayoutTestController::repaintSweepHorizontally); bindMethod("resumeAnimations", &LayoutTestController::resumeAnimations); - bindMethod("disableImageLoading", &LayoutTestController::disableImageLoading); - bindMethod("setIconDatabaseEnabled", &LayoutTestController::setIconDatabaseEnabled); + bindMethod("setAcceptsEditing", &LayoutTestController::setAcceptsEditing); + bindMethod("setAllowFileAccessFromFileURLs", &LayoutTestController::setAllowFileAccessFromFileURLs); + bindMethod("setAllowUniversalAccessFromFileURLs", &LayoutTestController::setAllowUniversalAccessFromFileURLs); + bindMethod("setAlwaysAcceptCookies", &LayoutTestController::setAlwaysAcceptCookies); + bindMethod("setAuthorAndUserStylesEnabled", &LayoutTestController::setAuthorAndUserStylesEnabled); + bindMethod("setCanOpenWindows", &LayoutTestController::setCanOpenWindows); + bindMethod("setCloseRemainingWindowsWhenComplete", &LayoutTestController::setCloseRemainingWindowsWhenComplete); bindMethod("setCustomPolicyDelegate", &LayoutTestController::setCustomPolicyDelegate); + bindMethod("setDatabaseQuota", &LayoutTestController::setDatabaseQuota); + bindMethod("setDeferMainResourceDataLoad", &LayoutTestController::setDeferMainResourceDataLoad); + bindMethod("setDomainRelaxationForbiddenForURLScheme", &LayoutTestController::setDomainRelaxationForbiddenForURLScheme); + bindMethod("setEditingBehavior", &LayoutTestController::setEditingBehavior); + bindMethod("setGeolocationPermission", &LayoutTestController::setGeolocationPermission); + bindMethod("setIconDatabaseEnabled", &LayoutTestController::setIconDatabaseEnabled); + bindMethod("setJavaScriptCanAccessClipboard", &LayoutTestController::setJavaScriptCanAccessClipboard); + bindMethod("setMockDeviceOrientation", &LayoutTestController::setMockDeviceOrientation); + bindMethod("setMockGeolocationError", &LayoutTestController::setMockGeolocationError); + bindMethod("setMockGeolocationPosition", &LayoutTestController::setMockGeolocationPosition); + bindMethod("setMockSpeechInputResult", &LayoutTestController::setMockSpeechInputResult); + bindMethod("setPopupBlockingEnabled", &LayoutTestController::setPopupBlockingEnabled); + bindMethod("setPOSIXLocale", &LayoutTestController::setPOSIXLocale); bindMethod("setScrollbarPolicy", &LayoutTestController::setScrollbarPolicy); - bindMethod("waitForPolicyDelegate", &LayoutTestController::waitForPolicyDelegate); + bindMethod("setSelectTrailingWhitespaceEnabled", &LayoutTestController::setSelectTrailingWhitespaceEnabled); + bindMethod("setSmartInsertDeleteEnabled", &LayoutTestController::setSmartInsertDeleteEnabled); + bindMethod("setStopProvisionalFrameLoads", &LayoutTestController::setStopProvisionalFrameLoads); + bindMethod("setTabKeyCyclesThroughElements", &LayoutTestController::setTabKeyCyclesThroughElements); + bindMethod("setTimelineProfilingEnabled", &LayoutTestController::setTimelineProfilingEnabled); + bindMethod("setUserStyleSheetEnabled", &LayoutTestController::setUserStyleSheetEnabled); + bindMethod("setUserStyleSheetLocation", &LayoutTestController::setUserStyleSheetLocation); bindMethod("setWillSendRequestClearHeader", &LayoutTestController::setWillSendRequestClearHeader); - bindMethod("setWillSendRequestReturnsNullOnRedirect", &LayoutTestController::setWillSendRequestReturnsNullOnRedirect); bindMethod("setWillSendRequestReturnsNull", &LayoutTestController::setWillSendRequestReturnsNull); - bindMethod("addOriginAccessWhitelistEntry", &LayoutTestController::addOriginAccessWhitelistEntry); - bindMethod("removeOriginAccessWhitelistEntry", &LayoutTestController::removeOriginAccessWhitelistEntry); - bindMethod("clearAllDatabases", &LayoutTestController::clearAllDatabases); - bindMethod("setDatabaseQuota", &LayoutTestController::setDatabaseQuota); - bindMethod("setPOSIXLocale", &LayoutTestController::setPOSIXLocale); - bindMethod("counterValueForElementById", &LayoutTestController::counterValueForElementById); - bindMethod("addUserScript", &LayoutTestController::addUserScript); - bindMethod("addUserStyleSheet", &LayoutTestController::addUserStyleSheet); - bindMethod("pageNumberForElementById", &LayoutTestController::pageNumberForElementById); - bindMethod("numberOfPages", &LayoutTestController::numberOfPages); - bindMethod("dumpSelectionRect", &LayoutTestController::dumpSelectionRect); - bindMethod("grantDesktopNotificationPermission", &LayoutTestController::grantDesktopNotificationPermission); + bindMethod("setWillSendRequestReturnsNullOnRedirect", &LayoutTestController::setWillSendRequestReturnsNullOnRedirect); + bindMethod("setWindowIsKey", &LayoutTestController::setWindowIsKey); + bindMethod("setXSSAuditorEnabled", &LayoutTestController::setXSSAuditorEnabled); + bindMethod("showWebInspector", &LayoutTestController::showWebInspector); bindMethod("simulateDesktopNotificationClick", &LayoutTestController::simulateDesktopNotificationClick); + bindMethod("suspendAnimations", &LayoutTestController::suspendAnimations); + bindMethod("testRepaint", &LayoutTestController::testRepaint); + bindMethod("waitForPolicyDelegate", &LayoutTestController::waitForPolicyDelegate); + bindMethod("waitUntilDone", &LayoutTestController::waitUntilDone); + bindMethod("windowCount", &LayoutTestController::windowCount); // The following are stubs. - bindMethod("dumpAsWebArchive", &LayoutTestController::dumpAsWebArchive); - bindMethod("setMainFrameIsFirstResponder", &LayoutTestController::setMainFrameIsFirstResponder); - bindMethod("dumpSelectionRect", &LayoutTestController::dumpSelectionRect); - bindMethod("display", &LayoutTestController::display); - bindMethod("testRepaint", &LayoutTestController::testRepaint); - bindMethod("repaintSweepHorizontally", &LayoutTestController::repaintSweepHorizontally); - bindMethod("clearBackForwardList", &LayoutTestController::clearBackForwardList); - bindMethod("keepWebHistory", &LayoutTestController::keepWebHistory); - bindMethod("storeWebScriptObject", &LayoutTestController::storeWebScriptObject); + bindMethod("abortModal", &LayoutTestController::abortModal); bindMethod("accessStoredWebScriptObject", &LayoutTestController::accessStoredWebScriptObject); - bindMethod("objCClassNameOf", &LayoutTestController::objCClassNameOf); bindMethod("addDisallowedURL", &LayoutTestController::addDisallowedURL); bindMethod("callShouldCloseOnWebView", &LayoutTestController::callShouldCloseOnWebView); + bindMethod("clearAllApplicationCaches", &LayoutTestController::clearAllApplicationCaches); + bindMethod("clearBackForwardList", &LayoutTestController::clearBackForwardList); + bindMethod("dumpAsWebArchive", &LayoutTestController::dumpAsWebArchive); + bindMethod("keepWebHistory", &LayoutTestController::keepWebHistory); + bindMethod("objCClassNameOf", &LayoutTestController::objCClassNameOf); + bindMethod("setApplicationCacheOriginQuota", &LayoutTestController::setApplicationCacheOriginQuota); bindMethod("setCallCloseOnWebViews", &LayoutTestController::setCallCloseOnWebViews); + bindMethod("setMainFrameIsFirstResponder", &LayoutTestController::setMainFrameIsFirstResponder); bindMethod("setPrivateBrowsingEnabled", &LayoutTestController::setPrivateBrowsingEnabled); bindMethod("setUseDashboardCompatibilityMode", &LayoutTestController::setUseDashboardCompatibilityMode); - bindMethod("clearAllApplicationCaches", &LayoutTestController::clearAllApplicationCaches); - bindMethod("setApplicationCacheOriginQuota", &LayoutTestController::setApplicationCacheOriginQuota); - - bindMethod("setJavaScriptCanAccessClipboard", &LayoutTestController::setJavaScriptCanAccessClipboard); - bindMethod("setXSSAuditorEnabled", &LayoutTestController::setXSSAuditorEnabled); - bindMethod("evaluateScriptInIsolatedWorld", &LayoutTestController::evaluateScriptInIsolatedWorld); - bindMethod("overridePreference", &LayoutTestController::overridePreference); - bindMethod("setAllowUniversalAccessFromFileURLs", &LayoutTestController::setAllowUniversalAccessFromFileURLs); - bindMethod("setAllowFileAccessFromFileURLs", &LayoutTestController::setAllowFileAccessFromFileURLs); - bindMethod("setTimelineProfilingEnabled", &LayoutTestController::setTimelineProfilingEnabled); - bindMethod("evaluateInWebInspector", &LayoutTestController::evaluateInWebInspector); - bindMethod("forceRedSelectionColors", &LayoutTestController::forceRedSelectionColors); - bindMethod("setEditingBehavior", &LayoutTestController::setEditingBehavior); - - bindMethod("setMockDeviceOrientation", &LayoutTestController::setMockDeviceOrientation); - - bindMethod("setGeolocationPermission", &LayoutTestController::setGeolocationPermission); - bindMethod("setMockGeolocationPosition", &LayoutTestController::setMockGeolocationPosition); - bindMethod("setMockGeolocationError", &LayoutTestController::setMockGeolocationError); - bindMethod("abortModal", &LayoutTestController::abortModal); - bindMethod("setMockSpeechInputResult", &LayoutTestController::setMockSpeechInputResult); - - bindMethod("markerTextForListItem", &LayoutTestController::markerTextForListItem); + bindMethod("storeWebScriptObject", &LayoutTestController::storeWebScriptObject); // The fallback method is called when an unknown method is invoked. bindFallbackMethod(&LayoutTestController::fallbackMethod); @@ -291,6 +291,12 @@ void LayoutTestController::dumpResourceLoadCallbacks(const CppArgumentList&, Cpp result->setNull(); } +void LayoutTestController::dumpResourceResponseMIMETypes(const CppArgumentList&, CppVariant* result) +{ + m_dumpResourceResponseMIMETypes = true; + result->setNull(); +} + void LayoutTestController::dumpChildFrameScrollPositions(const CppArgumentList&, CppVariant* result) { m_dumpChildFrameScrollPositions = true; @@ -460,6 +466,34 @@ void LayoutTestController::queueLoad(const CppArgumentList& arguments, CppVarian result->setNull(); } +class WorkItemLoadHTMLString : public LayoutTestController::WorkItem { +public: + WorkItemLoadHTMLString(const std::string& html, const WebURL& baseURL) + : m_html(html) + , m_baseURL(baseURL) {} + bool run(TestShell* shell) + { + shell->webView()->mainFrame()->loadHTMLString( + WebKit::WebData(m_html.data(), m_html.length()), m_baseURL); + return true; + } +private: + std::string m_html; + WebURL m_baseURL; +}; + +void LayoutTestController::queueLoadHTMLString(const CppArgumentList& arguments, CppVariant* result) +{ + if (arguments.size() > 0 && arguments[0].isString()) { + string html = arguments[0].toString(); + WebURL baseURL; + if (arguments.size() > 1 && arguments[1].isString()) + baseURL = WebURL(GURL(arguments[1].toString())); + m_workQueue.addWork(new WorkItemLoadHTMLString(html, baseURL)); + } + result->setNull(); +} + void LayoutTestController::objCIdentityIsEqual(const CppArgumentList& arguments, CppVariant* result) { if (arguments.size() < 2) { @@ -486,6 +520,7 @@ void LayoutTestController::reset() m_dumpEditingCallbacks = false; m_dumpFrameLoadCallbacks = false; m_dumpResourceLoadCallbacks = false; + m_dumpResourceResponseMIMETypes = false; m_dumpBackForwardList = false; m_dumpChildFrameScrollPositions = false; m_dumpChildFramesAsText = false; @@ -500,6 +535,7 @@ void LayoutTestController::reset() m_sweepHorizontally = false; m_shouldAddFileToPasteboard = false; m_stopProvisionalFrameLoads = false; + m_deferMainResourceDataLoad = true; m_globalFlag.set(false); m_webHistoryItemCount.set(0); m_userStyleSheetLocation = WebURL(); @@ -591,24 +627,30 @@ void LayoutTestController::setWindowIsKey(const CppArgumentList& arguments, CppV void LayoutTestController::setUserStyleSheetEnabled(const CppArgumentList& arguments, CppVariant* result) { - if (arguments.size() > 0 && arguments[0].isBool()) - m_shell->webView()->settings()->setUserStyleSheetLocation(arguments[0].value.boolValue ? m_userStyleSheetLocation : WebURL()); + if (arguments.size() > 0 && arguments[0].isBool()) { + m_shell->preferences()->userStyleSheetLocation = arguments[0].value.boolValue ? m_userStyleSheetLocation : WebURL(); + m_shell->applyPreferences(); + } result->setNull(); } void LayoutTestController::setUserStyleSheetLocation(const CppArgumentList& arguments, CppVariant* result) { if (arguments.size() > 0 && arguments[0].isString()) { - m_userStyleSheetLocation = webkit_support::RewriteLayoutTestsURL(arguments[0].toString()); - m_shell->webView()->settings()->setUserStyleSheetLocation(m_userStyleSheetLocation); + m_userStyleSheetLocation = webkit_support::LocalFileToDataURL( + webkit_support::RewriteLayoutTestsURL(arguments[0].toString())); + m_shell->preferences()->userStyleSheetLocation = m_userStyleSheetLocation; + m_shell->applyPreferences(); } result->setNull(); } void LayoutTestController::setAuthorAndUserStylesEnabled(const CppArgumentList& arguments, CppVariant* result) { - if (arguments.size() > 0 && arguments[0].isBool()) - m_shell->webView()->settings()->setAuthorAndUserStylesEnabled(arguments[0].value.boolValue); + if (arguments.size() > 0 && arguments[0].isBool()) { + m_shell->preferences()->authorAndUserStylesEnabled = arguments[0].value.boolValue; + m_shell->applyPreferences(); + } result->setNull(); } @@ -645,7 +687,8 @@ void LayoutTestController::setPopupBlockingEnabled(const CppArgumentList& argume { if (arguments.size() > 0 && arguments[0].isBool()) { bool blockPopups = arguments[0].toBoolean(); - m_shell->webView()->settings()->setJavaScriptCanOpenWindowsAutomatically(!blockPopups); + m_shell->preferences()->javaScriptCanOpenWindowsAutomatically = !blockPopups; + m_shell->applyPreferences(); } result->setNull(); } @@ -918,7 +961,8 @@ void LayoutTestController::resumeAnimations(const CppArgumentList&, CppVariant* void LayoutTestController::disableImageLoading(const CppArgumentList&, CppVariant* result) { - m_shell->webView()->settings()->setLoadsImagesAutomatically(false); + m_shell->preferences()->loadsImagesAutomatically = false; + m_shell->applyPreferences(); result->setNull(); } @@ -955,6 +999,19 @@ void LayoutTestController::simulateDesktopNotificationClick(const CppArgumentLis result->set(false); } +void LayoutTestController::setDomainRelaxationForbiddenForURLScheme(const CppArgumentList& arguments, CppVariant* result) +{ + if (arguments.size() != 2 || !arguments[0].isBool() || !arguments[1].isString()) + return; + m_shell->webView()->setDomainRelaxationForbidden(cppVariantToBool(arguments[0]), cppVariantToWebString(arguments[1])); +} + +void LayoutTestController::setDeferMainResourceDataLoad(const CppArgumentList& arguments, CppVariant* result) +{ + if (arguments.size() == 1) + m_deferMainResourceDataLoad = cppVariantToBool(arguments[0]); +} + // // Unimplemented stubs // @@ -1027,6 +1084,7 @@ void LayoutTestController::addDisallowedURL(const CppArgumentList& arguments, Cp { result->setNull(); } + void LayoutTestController::setCallCloseOnWebViews(const CppArgumentList& arguments, CppVariant* result) { result->setNull(); @@ -1039,15 +1097,19 @@ void LayoutTestController::setPrivateBrowsingEnabled(const CppArgumentList& argu void LayoutTestController::setJavaScriptCanAccessClipboard(const CppArgumentList& arguments, CppVariant* result) { - if (arguments.size() > 0 && arguments[0].isBool()) - m_shell->webView()->settings()->setJavaScriptCanAccessClipboard(arguments[0].value.boolValue); + if (arguments.size() > 0 && arguments[0].isBool()) { + m_shell->preferences()->javaScriptCanAccessClipboard = arguments[0].value.boolValue; + m_shell->applyPreferences(); + } result->setNull(); } void LayoutTestController::setXSSAuditorEnabled(const CppArgumentList& arguments, CppVariant* result) { - if (arguments.size() > 0 && arguments[0].isBool()) - m_shell->webView()->settings()->setXSSAuditorEnabled(arguments[0].value.boolValue); + if (arguments.size() > 0 && arguments[0].isBool()) { + m_shell->preferences()->XSSAuditorEnabled = arguments[0].value.boolValue; + m_shell->applyPreferences(); + } result->setNull(); } @@ -1064,15 +1126,19 @@ void LayoutTestController::evaluateScriptInIsolatedWorld(const CppArgumentList& void LayoutTestController::setAllowUniversalAccessFromFileURLs(const CppArgumentList& arguments, CppVariant* result) { - if (arguments.size() > 0 && arguments[0].isBool()) - m_shell->webView()->settings()->setAllowUniversalAccessFromFileURLs(arguments[0].value.boolValue); + if (arguments.size() > 0 && arguments[0].isBool()) { + m_shell->preferences()->allowUniversalAccessFromFileURLs = arguments[0].value.boolValue; + m_shell->applyPreferences(); + } result->setNull(); } void LayoutTestController::setAllowFileAccessFromFileURLs(const CppArgumentList& arguments, CppVariant* result) { - if (arguments.size() > 0 && arguments[0].isBool()) - m_shell->webView()->settings()->setAllowFileAccessFromFileURLs(arguments[0].value.boolValue); + if (arguments.size() > 0 && arguments[0].isBool()) { + m_shell->preferences()->allowFileAccessFromFileURLs = arguments[0].value.boolValue; + m_shell->applyPreferences(); + } result->setNull(); } @@ -1128,68 +1194,69 @@ void LayoutTestController::overridePreference(const CppArgumentList& arguments, string key = arguments[0].toString(); CppVariant value = arguments[1]; - WebSettings* settings = m_shell->webView()->settings(); + WebPreferences* prefs = m_shell->preferences(); if (key == "WebKitStandardFont") - settings->setStandardFontFamily(cppVariantToWebString(value)); + prefs->standardFontFamily = cppVariantToWebString(value); else if (key == "WebKitFixedFont") - settings->setFixedFontFamily(cppVariantToWebString(value)); + prefs->fixedFontFamily = cppVariantToWebString(value); else if (key == "WebKitSerifFont") - settings->setSerifFontFamily(cppVariantToWebString(value)); + prefs->serifFontFamily = cppVariantToWebString(value); else if (key == "WebKitSansSerifFont") - settings->setSansSerifFontFamily(cppVariantToWebString(value)); + prefs->sansSerifFontFamily = cppVariantToWebString(value); else if (key == "WebKitCursiveFont") - settings->setCursiveFontFamily(cppVariantToWebString(value)); + prefs->cursiveFontFamily = cppVariantToWebString(value); else if (key == "WebKitFantasyFont") - settings->setFantasyFontFamily(cppVariantToWebString(value)); + prefs->fantasyFontFamily = cppVariantToWebString(value); else if (key == "WebKitDefaultFontSize") - settings->setDefaultFontSize(cppVariantToInt32(value)); + prefs->defaultFontSize = cppVariantToInt32(value); else if (key == "WebKitDefaultFixedFontSize") - settings->setDefaultFixedFontSize(cppVariantToInt32(value)); + prefs->defaultFixedFontSize = cppVariantToInt32(value); else if (key == "WebKitMinimumFontSize") - settings->setMinimumFontSize(cppVariantToInt32(value)); + prefs->minimumFontSize = cppVariantToInt32(value); else if (key == "WebKitMinimumLogicalFontSize") - settings->setMinimumLogicalFontSize(cppVariantToInt32(value)); + prefs->minimumLogicalFontSize = cppVariantToInt32(value); else if (key == "WebKitDefaultTextEncodingName") - settings->setDefaultTextEncodingName(cppVariantToWebString(value)); + prefs->defaultTextEncodingName = cppVariantToWebString(value); else if (key == "WebKitJavaScriptEnabled") - settings->setJavaScriptEnabled(cppVariantToBool(value)); + prefs->javaScriptEnabled = cppVariantToBool(value); else if (key == "WebKitWebSecurityEnabled") - settings->setWebSecurityEnabled(cppVariantToBool(value)); + prefs->webSecurityEnabled = cppVariantToBool(value); else if (key == "WebKitJavaScriptCanOpenWindowsAutomatically") - settings->setJavaScriptCanOpenWindowsAutomatically(cppVariantToBool(value)); + prefs->javaScriptCanOpenWindowsAutomatically = cppVariantToBool(value); else if (key == "WebKitDisplayImagesKey") - settings->setLoadsImagesAutomatically(cppVariantToBool(value)); + prefs->loadsImagesAutomatically = cppVariantToBool(value); else if (key == "WebKitPluginsEnabled") - settings->setPluginsEnabled(cppVariantToBool(value)); + prefs->pluginsEnabled = cppVariantToBool(value); else if (key == "WebKitDOMPasteAllowedPreferenceKey") - settings->setDOMPasteAllowed(cppVariantToBool(value)); + prefs->DOMPasteAllowed = cppVariantToBool(value); else if (key == "WebKitDeveloperExtrasEnabledPreferenceKey") - settings->setDeveloperExtrasEnabled(cppVariantToBool(value)); + prefs->developerExtrasEnabled = cppVariantToBool(value); else if (key == "WebKitShrinksStandaloneImagesToFit") - settings->setShrinksStandaloneImagesToFit(cppVariantToBool(value)); + prefs->shrinksStandaloneImagesToFit = cppVariantToBool(value); else if (key == "WebKitTextAreasAreResizable") - settings->setTextAreasAreResizable(cppVariantToBool(value)); + prefs->textAreasAreResizable = cppVariantToBool(value); else if (key == "WebKitJavaEnabled") - settings->setJavaEnabled(cppVariantToBool(value)); + prefs->javaEnabled = cppVariantToBool(value); else if (key == "WebKitUsesPageCachePreferenceKey") - settings->setUsesPageCache(cppVariantToBool(value)); + prefs->usesPageCache = cppVariantToBool(value); else if (key == "WebKitJavaScriptCanAccessClipboard") - settings->setJavaScriptCanAccessClipboard(cppVariantToBool(value)); + prefs->javaScriptCanAccessClipboard = cppVariantToBool(value); else if (key == "WebKitXSSAuditorEnabled") - settings->setXSSAuditorEnabled(cppVariantToBool(value)); + prefs->XSSAuditorEnabled = cppVariantToBool(value); else if (key == "WebKitLocalStorageEnabledPreferenceKey") - settings->setLocalStorageEnabled(cppVariantToBool(value)); + prefs->localStorageEnabled = cppVariantToBool(value); else if (key == "WebKitOfflineWebApplicationCacheEnabled") - settings->setOfflineWebApplicationCacheEnabled(cppVariantToBool(value)); + prefs->offlineWebApplicationCacheEnabled = cppVariantToBool(value); else if (key == "WebKitTabToLinksPreferenceKey") - m_shell->webView()->setTabsToLinks(cppVariantToBool(value)); + prefs->tabsToLinks = cppVariantToBool(value); else if (key == "WebKitWebGLEnabled") - settings->setExperimentalWebGLEnabled(cppVariantToBool(value)); + prefs->experimentalWebGLEnabled = cppVariantToBool(value); else { string message("Invalid name for preference: "); message.append(key); logErrorToConsole(message); } + m_shell->applyPreferences(); } void LayoutTestController::fallbackMethod(const CppArgumentList&, CppVariant* result) @@ -1381,13 +1448,14 @@ void LayoutTestController::addUserStyleSheet(const CppArgumentList& arguments, C void LayoutTestController::setEditingBehavior(const CppArgumentList& arguments, CppVariant* results) { - WebSettings* settings = m_shell->webView()->settings(); string key = arguments[0].toString(); - if (key == "mac") - settings->setEditingBehavior(WebSettings::EditingBehaviorMac); - else if (key == "win") - settings->setEditingBehavior(WebSettings::EditingBehaviorWin); - else + if (key == "mac") { + m_shell->preferences()->editingBehavior = WebSettings::EditingBehaviorMac; + m_shell->applyPreferences(); + } else if (key == "win") { + m_shell->preferences()->editingBehavior = WebSettings::EditingBehaviorWin; + m_shell->applyPreferences(); + } else logErrorToConsole("Passed invalid editing behavior. Should be 'mac' or 'win'."); } @@ -1397,7 +1465,7 @@ void LayoutTestController::setMockDeviceOrientation(const CppArgumentList& argum if (arguments.size() < 6 || !arguments[0].isBool() || !arguments[1].isNumber() || !arguments[2].isBool() || !arguments[3].isNumber() || !arguments[4].isBool() || !arguments[5].isNumber()) return; - WebKit::WebDeviceOrientation orientation(arguments[0].toBoolean(), arguments[1].toDouble(), arguments[2].toBoolean(), arguments[3].toDouble(), arguments[4].toBoolean(), arguments[5].toDouble()); + WebDeviceOrientation orientation(arguments[0].toBoolean(), arguments[1].toDouble(), arguments[2].toBoolean(), arguments[3].toDouble(), arguments[4].toBoolean(), arguments[5].toDouble()); ASSERT(m_deviceOrientationClientMock); m_deviceOrientationClientMock->setOrientation(orientation); @@ -1457,9 +1525,9 @@ void LayoutTestController::markerTextForListItem(const CppArgumentList& args, Cp result->set(element.document().frame()->markerTextForListItem(element).utf8()); } -WebKit::WebDeviceOrientationClient* LayoutTestController::deviceOrientationClient() +WebDeviceOrientationClient* LayoutTestController::deviceOrientationClient() { if (!m_deviceOrientationClientMock.get()) - m_deviceOrientationClientMock.set(new WebKit::WebDeviceOrientationClientMock()); + m_deviceOrientationClientMock.set(WebDeviceOrientationClientMock::create()); return m_deviceOrientationClientMock.get(); } diff --git a/WebKitTools/DumpRenderTree/chromium/LayoutTestController.h b/WebKitTools/DumpRenderTree/chromium/LayoutTestController.h index 7bb22ca..ec2503f 100644 --- a/WebKitTools/DumpRenderTree/chromium/LayoutTestController.h +++ b/WebKitTools/DumpRenderTree/chromium/LayoutTestController.h @@ -100,6 +100,16 @@ public: // dump all frames as plain text if the dumpAsText flag is set. // It takes no arguments, and ignores any that may be present. void dumpChildFramesAsText(const CppArgumentList&, CppVariant*); + + // This function sets a flag that tells the test_shell to dump a descriptive + // line for each resource load callback. It takes no arguments, and ignores + // any that may be present. + void dumpResourceLoadCallbacks(const CppArgumentList&, CppVariant*); + + // This function sets a flag that tells the test_shell to dump the MIME type + // for each resource that was loaded. It takes no arguments, and ignores any + // that may be present. + void dumpResourceResponseMIMETypes(const CppArgumentList&, CppVariant*); // This function sets a flag that tells the test_shell to dump all calls // to window.status(). @@ -129,6 +139,7 @@ public: void queueLoadingScript(const CppArgumentList&, CppVariant*); void queueNonLoadingScript(const CppArgumentList&, CppVariant*); void queueLoad(const CppArgumentList&, CppVariant*); + void queueLoadHTMLString(const CppArgumentList&, CppVariant*); // Although this is named "objC" to match the Mac version, it actually tests // the identity of its two arguments in C++. @@ -212,11 +223,8 @@ public: void numberOfActiveAnimations(const CppArgumentList&, CppVariant*); void suspendAnimations(const CppArgumentList&, CppVariant*); void resumeAnimations(const CppArgumentList&, CppVariant*); - void disableImageLoading(const CppArgumentList&, CppVariant*); - void setIconDatabaseEnabled(const CppArgumentList&, CppVariant*); - void dumpSelectionRect(const CppArgumentList&, CppVariant*); // Grants permission for desktop notifications to an origin @@ -224,13 +232,14 @@ public: // Simulates a click on a desktop notification. void simulateDesktopNotificationClick(const CppArgumentList&, CppVariant*); + void setDomainRelaxationForbiddenForURLScheme(const CppArgumentList&, CppVariant*); + void setDeferMainResourceDataLoad(const CppArgumentList&, CppVariant*); void setEditingBehavior(const CppArgumentList&, CppVariant*); // The following are only stubs. TODO(pamg): Implement any of these that // are needed to pass the layout tests. void dumpAsWebArchive(const CppArgumentList&, CppVariant*); void dumpTitleChanges(const CppArgumentList&, CppVariant*); - void dumpResourceLoadCallbacks(const CppArgumentList&, CppVariant*); void setMainFrameIsFirstResponder(const CppArgumentList&, CppVariant*); void display(const CppArgumentList&, CppVariant*); void testRepaint(const CppArgumentList&, CppVariant*); @@ -328,6 +337,8 @@ public: bool shouldDumpFrameLoadCallbacks() { return m_dumpFrameLoadCallbacks; } void setShouldDumpFrameLoadCallbacks(bool value) { m_dumpFrameLoadCallbacks = value; } bool shouldDumpResourceLoadCallbacks() {return m_dumpResourceLoadCallbacks; } + void setShouldDumpResourceResponseMIMETypes(bool value) { m_dumpResourceResponseMIMETypes = value; } + bool shouldDumpResourceResponseMIMETypes() {return m_dumpResourceResponseMIMETypes; } bool shouldDumpStatusCallbacks() { return m_dumpWindowStatusChanges; } bool shouldDumpSelectionRect() { return m_dumpSelectionRect; } bool shouldDumpBackForwardList() { return m_dumpBackForwardList; } @@ -339,6 +350,7 @@ public: bool canOpenWindows() { return m_canOpenWindows; } bool shouldAddFileToPasteboard() { return m_shouldAddFileToPasteboard; } bool stopProvisionalFrameLoads() { return m_stopProvisionalFrameLoads; } + bool deferMainResourceDataLoad() { return m_deferMainResourceDataLoad; } bool testRepaint() const { return m_testRepaint; } bool sweepHorizontally() const { return m_sweepHorizontally; } @@ -447,6 +459,10 @@ private: // If true, the test_shell will output a descriptive line for each resource // load callback. bool m_dumpResourceLoadCallbacks; + + // If true, the test_shell will output the MIME type for each resource that + // was loaded. + bool m_dumpResourceResponseMIMETypes; // If true, the test_shell will produce a dump of the back forward list as // well. @@ -501,6 +517,9 @@ private: // If true, don't dump output until notifyDone is called. bool m_waitUntilDone; + // If false, all new requests will not defer the main resource data load. + bool m_deferMainResourceDataLoad; + WorkQueue m_workQueue; CppVariant m_globalFlag; diff --git a/WebKitTools/DumpRenderTree/chromium/TestShell.cpp b/WebKitTools/DumpRenderTree/chromium/TestShell.cpp index 4557803..15d6dee 100644 --- a/WebKitTools/DumpRenderTree/chromium/TestShell.cpp +++ b/WebKitTools/DumpRenderTree/chromium/TestShell.cpp @@ -35,8 +35,6 @@ #include "DRTDevToolsClient.h" #include "LayoutTestController.h" #include "WebViewHost.h" -#include "base/string16.h" -#include "gfx/codec/png_codec.h" // FIXME: Remove dependecy. WebCore/platform/image-encoder is better? #include "public/WebDataSource.h" #include "public/WebDocument.h" #include "public/WebElement.h" @@ -55,6 +53,7 @@ #include "skia/ext/bitmap_platform_device.h" #include "skia/ext/platform_canvas.h" #include "webkit/support/webkit_support.h" +#include "webkit/support/webkit_support_gfx.h" #include <algorithm> #include <cctype> #include <vector> @@ -155,84 +154,8 @@ void TestShell::closeDevTools() void TestShell::resetWebSettings(WebView& webView) { - // Match the settings used by Mac DumpRenderTree, with the exception of - // fonts. - WebSettings* settings = webView.settings(); -#if OS(MAC_OS_X) - WebString serif = WebString::fromUTF8("Times"); - settings->setCursiveFontFamily(WebString::fromUTF8("Apple Chancery")); - settings->setFantasyFontFamily(WebString::fromUTF8("Papyrus")); -#else - // NOTE: case matters here, this must be 'times new roman', else - // some layout tests fail. - WebString serif = WebString::fromUTF8("times new roman"); - - // These two fonts are picked from the intersection of - // Win XP font list and Vista font list : - // http://www.microsoft.com/typography/fonts/winxp.htm - // http://blogs.msdn.com/michkap/archive/2006/04/04/567881.aspx - // Some of them are installed only with CJK and complex script - // support enabled on Windows XP and are out of consideration here. - // (although we enabled both on our buildbots.) - // They (especially Impact for fantasy) are not typical cursive - // and fantasy fonts, but it should not matter for layout tests - // as long as they're available. - settings->setCursiveFontFamily(WebString::fromUTF8("Comic Sans MS")); - settings->setFantasyFontFamily(WebString::fromUTF8("Impact")); -#endif - settings->setSerifFontFamily(serif); - settings->setStandardFontFamily(serif); - settings->setFixedFontFamily(WebString::fromUTF8("Courier")); - settings->setSansSerifFontFamily(WebString::fromUTF8("Helvetica")); - - settings->setDefaultTextEncodingName(WebString::fromUTF8("ISO-8859-1")); - settings->setDefaultFontSize(16); - settings->setDefaultFixedFontSize(13); - settings->setMinimumFontSize(1); - settings->setMinimumLogicalFontSize(9); - settings->setJavaScriptCanOpenWindowsAutomatically(true); - settings->setJavaScriptCanAccessClipboard(true); - settings->setDOMPasteAllowed(true); - settings->setDeveloperExtrasEnabled(false); - settings->setNeedsSiteSpecificQuirks(true); - settings->setShrinksStandaloneImagesToFit(false); - settings->setUsesEncodingDetector(false); - settings->setTextAreasAreResizable(false); - settings->setJavaEnabled(false); - settings->setAllowScriptsToCloseWindows(false); - settings->setXSSAuditorEnabled(false); - settings->setDownloadableBinaryFontsEnabled(true); - settings->setLocalStorageEnabled(true); - settings->setOfflineWebApplicationCacheEnabled(true); - settings->setAllowFileAccessFromFileURLs(true); - settings->setUserStyleSheetLocation(WebURL()); - - // LayoutTests were written with Safari Mac in mind which does not allow - // tabbing to links by default. - webView.setTabsToLinks(false); - - // Allow those layout tests running as local files, i.e. under - // LayoutTests/http/tests/local, to access http server. - settings->setAllowUniversalAccessFromFileURLs(true); - - settings->setJavaScriptEnabled(true); - settings->setPluginsEnabled(true); - settings->setWebSecurityEnabled(true); - settings->setEditableLinkBehaviorNeverLive(); - settings->setFontRenderingModeNormal(); - settings->setShouldPaintCustomScrollbars(true); - settings->setTextDirectionSubmenuInclusionBehaviorNeverIncluded(); - - settings->setLoadsImagesAutomatically(true); - settings->setImagesEnabled(true); - -#if OS(DARWIN) - settings->setEditingBehavior(WebSettings::EditingBehaviorMac); -#else - settings->setEditingBehavior(WebSettings::EditingBehaviorWin); -#endif - // FIXME: crbug.com/51879 - settings->setAcceleratedCompositingEnabled(false); + m_prefs.reset(); + m_prefs.applyTo(&webView); } void TestShell::runFileTest(const TestParams& params) @@ -244,7 +167,8 @@ void TestShell::runFileTest(const TestParams& params) bool inspectorTestMode = testUrl.find("/inspector/") != string::npos || testUrl.find("\\inspector\\") != string::npos; - m_webView->settings()->setDeveloperExtrasEnabled(inspectorTestMode); + m_prefs.developerExtrasEnabled = inspectorTestMode; + applyPreferences(); if (testUrl.find("loading/") != string::npos || testUrl.find("loading\\") != string::npos) @@ -585,23 +509,15 @@ void TestShell::dumpImage(skia::PlatformCanvas* canvas) const // to keep it. On Windows, the alpha channel is wrong since text/form control // drawing may have erased it in a few places. So on Windows we force it to // opaque and also don't write the alpha channel for the reference. Linux - // doesn't have the wrong alpha like Windows, but we ignore it anyway. -#if OS(WINDOWS) - bool discardTransparency = true; - device.makeOpaque(0, 0, sourceBitmap.width(), sourceBitmap.height()); -#elif OS(MAC_OS_X) + // doesn't have the wrong alpha like Windows, but we match Windows. +#if OS(MAC_OS_X) bool discardTransparency = false; -#elif OS(UNIX) +#else bool discardTransparency = true; - if (areLayoutTestImagesOpaque()) - device.makeOpaque(0, 0, sourceBitmap.width(), sourceBitmap.height()); + device.makeOpaque(0, 0, sourceBitmap.width(), sourceBitmap.height()); #endif - // Compute MD5 sum. We should have done this before calling - // device.makeOpaque on Windows. Because we do it after the call, there are - // some images that are the pixel identical on windows and other platforms - // but have different MD5 sums. At this point, rebaselining all the windows - // tests is too much of a pain, so we just check in different baselines. + // Compute MD5 sum. MD5 digester; Vector<uint8_t, 16> digestValue; digester.addBytes(reinterpret_cast<const uint8_t*>(sourceBitmap.getPixels()), sourceBitmap.getSize()); @@ -619,10 +535,9 @@ void TestShell::dumpImage(skia::PlatformCanvas* canvas) const // is really expensive. if (md5hash.compare(m_params.pixelHash)) { std::vector<unsigned char> png; - gfx::PNGCodec::ColorFormat colorFormat = gfx::PNGCodec::FORMAT_BGRA; - gfx::PNGCodec::Encode( + webkit_support::EncodeBGRAPNG( reinterpret_cast<const unsigned char*>(sourceBitmap.getPixels()), - colorFormat, sourceBitmap.width(), sourceBitmap.height(), + sourceBitmap.width(), sourceBitmap.height(), static_cast<int>(sourceBitmap.rowBytes()), discardTransparency, &png); m_printer->handleImage(md5hash.c_str(), m_params.pixelHash.c_str(), &png[0], png.size(), m_params.pixelFileName.c_str()); @@ -649,7 +564,7 @@ WebViewHost* TestShell::createNewWindow(const WebURL& url) WebViewHost* host = new WebViewHost(this); WebView* view = WebView::create(host, m_drtDevToolsAgent.get()); host->setWebWidget(view); - resetWebSettings(*view); + m_prefs.applyTo(view); view->initializeMainFrame(host); m_windowList.append(host); host->loadURLForFrame(url, WebString()); diff --git a/WebKitTools/DumpRenderTree/chromium/TestShell.h b/WebKitTools/DumpRenderTree/chromium/TestShell.h index cb5f862..6d93d4a 100644 --- a/WebKitTools/DumpRenderTree/chromium/TestShell.h +++ b/WebKitTools/DumpRenderTree/chromium/TestShell.h @@ -38,6 +38,7 @@ #include "PlainTextController.h" #include "TestEventPrinter.h" #include "TextInputController.h" +#include "WebPreferences.h" #include "WebViewHost.h" #include <string> #include <wtf/OwnPtr.h> @@ -50,7 +51,6 @@ namespace WebKit { class WebDevToolsAgentClient; class WebFrame; class WebNotificationPresenter; -class WebPreferences; class WebView; class WebURL; } @@ -92,6 +92,9 @@ public: NotificationPresenter* notificationPresenter() const { return m_notificationPresenter.get(); } TestEventPrinter* printer() const { return m_printer.get(); } + WebPreferences* preferences() { return &m_prefs; } + void applyPreferences() { m_prefs.applyTo(m_webView); } + void bindJSObjectsToWindow(WebKit::WebFrame*); void runFileTest(const TestParams&); void callJSGC(); @@ -107,6 +110,7 @@ public: void setFocus(WebKit::WebWidget*, bool enable); bool shouldDumpFrameLoadCallbacks() const { return (m_testIsPreparing || m_testIsPending) && layoutTestController()->shouldDumpFrameLoadCallbacks(); } bool shouldDumpResourceLoadCallbacks() const { return (m_testIsPreparing || m_testIsPending) && layoutTestController()->shouldDumpResourceLoadCallbacks(); } + bool shouldDumpResourceResponseMIMETypes() const { return (m_testIsPreparing || m_testIsPending) && layoutTestController()->shouldDumpResourceResponseMIMETypes(); } void setIsLoading(bool flag) { m_isLoading = flag; } // Called by the LayoutTestController to signal test completion. @@ -147,7 +151,7 @@ public: private: void createDRTDevToolsClient(DRTDevToolsAgent*); - static void resetWebSettings(WebKit::WebView&); + void resetWebSettings(WebKit::WebView&); void dump(); std::string dumpAllBackForwardLists(); void dumpImage(skia::PlatformCanvas*) const; @@ -172,6 +176,7 @@ private: TestParams m_params; int m_timeout; // timeout value in millisecond bool m_allowExternalPages; + WebPreferences m_prefs; // List of all windows in this process. // The main window should be put into windowList[0]. diff --git a/WebKitTools/DumpRenderTree/chromium/TextInputController.cpp b/WebKitTools/DumpRenderTree/chromium/TextInputController.cpp index 63c4719..16f1575 100644 --- a/WebKitTools/DumpRenderTree/chromium/TextInputController.cpp +++ b/WebKitTools/DumpRenderTree/chromium/TextInputController.cpp @@ -51,20 +51,21 @@ TextInputController::TextInputController(TestShell* shell) if (!testShell) testShell = shell; - bindMethod("insertText", &TextInputController::insertText); + bindMethod("attributedSubstringFromRange", &TextInputController::attributedSubstringFromRange); + bindMethod("characterIndexForPoint", &TextInputController::characterIndexForPoint); + bindMethod("conversationIdentifier", &TextInputController::conversationIdentifier); bindMethod("doCommand", &TextInputController::doCommand); - bindMethod("setMarkedText", &TextInputController::setMarkedText); - bindMethod("unmarkText", &TextInputController::unmarkText); + bindMethod("firstRectForCharacterRange", &TextInputController::firstRectForCharacterRange); bindMethod("hasMarkedText", &TextInputController::hasMarkedText); - bindMethod("conversationIdentifier", &TextInputController::conversationIdentifier); - bindMethod("substringFromRange", &TextInputController::substringFromRange); - bindMethod("attributedSubstringFromRange", &TextInputController::attributedSubstringFromRange); + bindMethod("hasSpellingMarker", &TextInputController::hasSpellingMarker); + bindMethod("insertText", &TextInputController::insertText); + bindMethod("makeAttributedString", &TextInputController::makeAttributedString); bindMethod("markedRange", &TextInputController::markedRange); bindMethod("selectedRange", &TextInputController::selectedRange); - bindMethod("firstRectForCharacterRange", &TextInputController::firstRectForCharacterRange); - bindMethod("characterIndexForPoint", &TextInputController::characterIndexForPoint); + bindMethod("setMarkedText", &TextInputController::setMarkedText); + bindMethod("substringFromRange", &TextInputController::substringFromRange); + bindMethod("unmarkText", &TextInputController::unmarkText); bindMethod("validAttributesForMarkedText", &TextInputController::validAttributesForMarkedText); - bindMethod("makeAttributedString", &TextInputController::makeAttributedString); } WebFrame* TextInputController::getMainFrame() @@ -214,3 +215,14 @@ void TextInputController::makeAttributedString(const CppArgumentList&, CppVarian // FIXME: Implement this. result->setNull(); } + +void TextInputController::hasSpellingMarker(const CppArgumentList& arguments, CppVariant* result) +{ + if (arguments.size() < 2 || !arguments[0].isNumber() || !arguments[1].isNumber()) + return; + WebFrame* mainFrame = getMainFrame(); + if (!mainFrame) + return; + // Returns as a number for a compatibility reason. + result->set(mainFrame->selectionStartHasSpellingMarkerFor(arguments[0].toInt32(), arguments[1].toInt32()) ? 1 : 0); +} diff --git a/WebKitTools/DumpRenderTree/chromium/TextInputController.h b/WebKitTools/DumpRenderTree/chromium/TextInputController.h index 9896be5..ddacefe 100644 --- a/WebKitTools/DumpRenderTree/chromium/TextInputController.h +++ b/WebKitTools/DumpRenderTree/chromium/TextInputController.h @@ -61,6 +61,7 @@ public: void characterIndexForPoint(const CppArgumentList&, CppVariant*); void validAttributesForMarkedText(const CppArgumentList&, CppVariant*); void makeAttributedString(const CppArgumentList&, CppVariant*); + void hasSpellingMarker(const CppArgumentList&, CppVariant*); private: // Returns the test shell's main WebFrame. diff --git a/WebKitTools/DumpRenderTree/chromium/WebPreferences.cpp b/WebKitTools/DumpRenderTree/chromium/WebPreferences.cpp new file mode 100644 index 0000000..004865a --- /dev/null +++ b/WebKitTools/DumpRenderTree/chromium/WebPreferences.cpp @@ -0,0 +1,161 @@ +/* + * 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. + */ + +#include "config.h" +#include "WebPreferences.h" + +#include "public/WebView.h" + +using namespace WebKit; + +void WebPreferences::reset() +{ +#if OS(MAC_OS_X) + cursiveFontFamily = WebString::fromUTF8("Apple Chancery"); + fantasyFontFamily = WebString::fromUTF8("Papyrus"); + WebString serif = WebString::fromUTF8("Times"); +#else + // These two fonts are picked from the intersection of + // Win XP font list and Vista font list : + // http://www.microsoft.com/typography/fonts/winxp.htm + // http://blogs.msdn.com/michkap/archive/2006/04/04/567881.aspx + // Some of them are installed only with CJK and complex script + // support enabled on Windows XP and are out of consideration here. + // (although we enabled both on our buildbots.) + // They (especially Impact for fantasy) are not typical cursive + // and fantasy fonts, but it should not matter for layout tests + // as long as they're available. + cursiveFontFamily = WebString::fromUTF8("Comic Sans MS"); + fantasyFontFamily = WebString::fromUTF8("Impact"); + // NOTE: case matters here, this must be 'times new roman', else + // some layout tests fail. + WebString serif = WebString::fromUTF8("times new roman"); +#endif + serifFontFamily = serif; + standardFontFamily = serif; + fixedFontFamily = WebString::fromUTF8("Courier"); + sansSerifFontFamily = WebString::fromUTF8("Helvetica"); + + defaultFontSize = 16; + defaultFixedFontSize = 13; + minimumFontSize = 1; + minimumLogicalFontSize = 9; + + DOMPasteAllowed = true; + XSSAuditorEnabled = false; + allowFileAccessFromFileURLs = true; + authorAndUserStylesEnabled = true; + defaultTextEncodingName = WebString::fromUTF8("ISO-8859-1"); + developerExtrasEnabled = false; + experimentalWebGLEnabled = false; + javaEnabled = false; + javaScriptCanAccessClipboard = true; + javaScriptCanOpenWindowsAutomatically = true; + javaScriptEnabled = true; + loadsImagesAutomatically = true; + localStorageEnabled = true; + offlineWebApplicationCacheEnabled = true; + pluginsEnabled = true; + shrinksStandaloneImagesToFit = false; + textAreasAreResizable = false; + userStyleSheetLocation = WebURL(); + usesPageCache = false; + webSecurityEnabled = true; + + // Allow those layout tests running as local files, i.e. under + // LayoutTests/http/tests/local, to access http server. + allowUniversalAccessFromFileURLs = true; + +#if OS(DARWIN) + editingBehavior = WebSettings::EditingBehaviorMac; +#else + editingBehavior = WebSettings::EditingBehaviorWin; +#endif + + tabsToLinks = false; +} + +void WebPreferences::applyTo(WebView* webView) +{ + WebSettings* settings = webView->settings(); + settings->setCursiveFontFamily(cursiveFontFamily); + settings->setFantasyFontFamily(fantasyFontFamily); + settings->setSerifFontFamily(serifFontFamily); + settings->setStandardFontFamily(standardFontFamily); + settings->setFixedFontFamily(fixedFontFamily); + settings->setSansSerifFontFamily(sansSerifFontFamily); + + settings->setDefaultFontSize(defaultFontSize); + settings->setDefaultFixedFontSize(defaultFixedFontSize); + settings->setMinimumFontSize(minimumFontSize); + settings->setMinimumLogicalFontSize(minimumLogicalFontSize); + + settings->setDOMPasteAllowed(DOMPasteAllowed); + settings->setXSSAuditorEnabled(XSSAuditorEnabled); + settings->setAllowFileAccessFromFileURLs(allowFileAccessFromFileURLs); + settings->setAuthorAndUserStylesEnabled(authorAndUserStylesEnabled); + settings->setDefaultTextEncodingName(defaultTextEncodingName); + settings->setDeveloperExtrasEnabled(developerExtrasEnabled); + settings->setExperimentalWebGLEnabled(experimentalWebGLEnabled); + settings->setJavaEnabled(javaEnabled); + settings->setJavaScriptCanAccessClipboard(javaScriptCanAccessClipboard); + settings->setJavaScriptCanOpenWindowsAutomatically(javaScriptCanOpenWindowsAutomatically); + settings->setJavaScriptEnabled(javaScriptEnabled); + settings->setLoadsImagesAutomatically(loadsImagesAutomatically); + settings->setLocalStorageEnabled(localStorageEnabled); + settings->setOfflineWebApplicationCacheEnabled(offlineWebApplicationCacheEnabled); + settings->setPluginsEnabled(pluginsEnabled); + settings->setShrinksStandaloneImagesToFit(shrinksStandaloneImagesToFit); + settings->setTextAreasAreResizable(textAreasAreResizable); + settings->setUserStyleSheetLocation(userStyleSheetLocation); + settings->setUsesPageCache(usesPageCache); + settings->setWebSecurityEnabled(webSecurityEnabled); + settings->setAllowUniversalAccessFromFileURLs(allowUniversalAccessFromFileURLs); + settings->setEditingBehavior(editingBehavior); + // LayoutTests were written with Safari Mac in mind which does not allow + // tabbing to links by default. + webView->setTabsToLinks(tabsToLinks); + + // Fixed values. + settings->setShouldPaintCustomScrollbars(true); + settings->setTextDirectionSubmenuInclusionBehaviorNeverIncluded(); + settings->setDownloadableBinaryFontsEnabled(true); + settings->setAllowScriptsToCloseWindows(false); + settings->setNeedsSiteSpecificQuirks(true); + settings->setEditableLinkBehaviorNeverLive(); + settings->setFontRenderingModeNormal(); + settings->setTextDirectionSubmenuInclusionBehaviorNeverIncluded(); + settings->setUsesEncodingDetector(false); + settings->setImagesEnabled(true); + + // FIXME: crbug.com/51879 + settings->setAcceleratedCompositingEnabled(false); +} + diff --git a/WebKitTools/DumpRenderTree/chromium/WebPreferences.h b/WebKitTools/DumpRenderTree/chromium/WebPreferences.h new file mode 100644 index 0000000..f197c16 --- /dev/null +++ b/WebKitTools/DumpRenderTree/chromium/WebPreferences.h @@ -0,0 +1,84 @@ +/* + * 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. + */ + +#ifndef WebPreferences_h +#define WebPerferences_h + +#include "public/WebSettings.h" +#include "public/WebString.h" +#include "public/WebURL.h" + +namespace WebKit { +class WebView; +} + +struct WebPreferences { + WebKit::WebString cursiveFontFamily; + WebKit::WebString fantasyFontFamily; + WebKit::WebString serifFontFamily; + WebKit::WebString standardFontFamily; + WebKit::WebString fixedFontFamily; + WebKit::WebString sansSerifFontFamily; + + int defaultFontSize; + int defaultFixedFontSize; + int minimumFontSize; + int minimumLogicalFontSize; + + bool DOMPasteAllowed; + bool XSSAuditorEnabled; + bool allowFileAccessFromFileURLs; + bool authorAndUserStylesEnabled; + WebKit::WebString defaultTextEncodingName; + bool developerExtrasEnabled; + bool experimentalWebGLEnabled; + bool javaEnabled; + bool javaScriptCanAccessClipboard; + bool javaScriptCanOpenWindowsAutomatically; + bool javaScriptEnabled; + bool loadsImagesAutomatically; + bool localStorageEnabled; + bool offlineWebApplicationCacheEnabled; + bool pluginsEnabled; + bool shrinksStandaloneImagesToFit; + bool textAreasAreResizable; + WebKit::WebURL userStyleSheetLocation; + bool usesPageCache; + bool webSecurityEnabled; + bool allowUniversalAccessFromFileURLs; + WebKit::WebSettings::EditingBehavior editingBehavior; + bool tabsToLinks; + + WebPreferences() { reset(); } + void reset(); + void applyTo(WebKit::WebView*); +}; + +#endif // WebPreferences_h diff --git a/WebKitTools/DumpRenderTree/chromium/WebViewHost.cpp b/WebKitTools/DumpRenderTree/chromium/WebViewHost.cpp index 1e3a4d6..9a086e4 100644 --- a/WebKitTools/DumpRenderTree/chromium/WebViewHost.cpp +++ b/WebKitTools/DumpRenderTree/chromium/WebViewHost.cpp @@ -40,6 +40,7 @@ #include "public/WebContextMenuData.h" #include "public/WebDataSource.h" #include "public/WebDragData.h" +#include "public/WebElement.h" #include "public/WebFrame.h" #include "public/WebGeolocationServiceMock.h" #include "public/WebHistoryItem.h" @@ -489,10 +490,68 @@ void WebViewHost::focusAccessibilityObject(const WebAccessibilityObject& object) m_shell->accessibilityController()->setFocusedElement(object); } -void WebViewHost::didChangeAccessibilityObjectChildren(const WebAccessibilityObject& object) -{ - if (m_shell->accessibilityController()->shouldDumpAccessibilityNotifications()) - printf("didChangeAccessibilityObjectChildren - new count: %d\n", object.childCount()); +void WebViewHost::postAccessibilityNotification(const WebAccessibilityObject& obj, WebAccessibilityNotification notification) +{ + if (m_shell->accessibilityController()->shouldDumpAccessibilityNotifications()) { + printf("AccessibilityNotification - "); + + switch (notification) { + case WebAccessibilityNotificationActiveDescendantChanged: + printf("ActiveDescendantChanged"); + break; + case WebAccessibilityNotificationCheckedStateChanged: + printf("CheckedStateChanged"); + break; + case WebAccessibilityNotificationChildrenChanged: + printf("ChildrenChanged"); + break; + case WebAccessibilityNotificationFocusedUIElementChanged: + printf("FocusedUIElementChanged"); + break; + case WebAccessibilityNotificationLayoutComplete: + printf("LayoutComplete"); + break; + case WebAccessibilityNotificationLoadComplete: + printf("LoadComplete"); + break; + case WebAccessibilityNotificationSelectedChildrenChanged: + printf("SelectedChildrenChanged"); + break; + case WebAccessibilityNotificationSelectedTextChanged: + printf("SelectedTextChanged"); + break; + case WebAccessibilityNotificationValueChanged: + printf("ValueChanged"); + break; + case WebAccessibilityNotificationScrolledToAnchor: + printf("ScrolledToAnchor"); + break; + case WebAccessibilityNotificationLiveRegionChanged: + printf("LiveRegionChanged"); + break; + case WebAccessibilityNotificationMenuListValueChanged: + printf("MenuListValueChanged"); + break; + case WebAccessibilityNotificationRowCountChanged: + printf("RowCountChanged"); + break; + case WebAccessibilityNotificationRowCollapsed: + printf("RowCollapsed"); + break; + case WebAccessibilityNotificationRowExpanded: + printf("RowExpanded"); + break; + } + + WebKit::WebNode node = obj.node(); + if (!node.isNull() && node.isElementNode()) { + WebKit::WebElement element = node.to<WebKit::WebElement>(); + if (element.hasAttribute("id")) + printf(" - id:%s", element.getAttribute("id").utf8().data()); + } + + printf("\n"); + } } WebNotificationPresenter* WebViewHost::notificationPresenter() @@ -731,6 +790,8 @@ void WebViewHost::didCancelClientRedirect(WebFrame* frame) void WebViewHost::didCreateDataSource(WebFrame*, WebDataSource* ds) { ds->setExtraData(m_pendingExtraData.leakPtr()); + if (!layoutTestController()->deferMainResourceDataLoad()) + ds->setDeferMainResourceDataLoad(false); } void WebViewHost::didStartProvisionalLoad(WebFrame* frame) @@ -920,12 +981,20 @@ void WebViewHost::willSendRequest(WebFrame*, unsigned identifier, WebURLRequest& void WebViewHost::didReceiveResponse(WebFrame*, unsigned identifier, const WebURLResponse& response) { - if (!m_shell->shouldDumpResourceLoadCallbacks()) - return; - printResourceDescription(identifier); - fputs(" - didReceiveResponse ", stdout); - printResponseDescription(response); - fputs("\n", stdout); + if (m_shell->shouldDumpResourceLoadCallbacks()) { + printResourceDescription(identifier); + fputs(" - didReceiveResponse ", stdout); + printResponseDescription(response); + fputs("\n", stdout); + } + if (m_shell->shouldDumpResourceResponseMIMETypes()) { + GURL url = response.url(); + WebString mimeType = response.mimeType(); + printf("%s has MIME type %s\n", + url.ExtractFileName().c_str(), + // Simulate NSURLResponse's mapping of empty/unknown MIME types to application/octet-stream + mimeType.isEmpty() ? "application/octet-stream" : mimeType.utf8().data()); + } } void WebViewHost::didFinishResourceLoad(WebFrame*, unsigned identifier) diff --git a/WebKitTools/DumpRenderTree/chromium/WebViewHost.h b/WebKitTools/DumpRenderTree/chromium/WebViewHost.h index 3a84ebd..bbb132d 100644 --- a/WebKitTools/DumpRenderTree/chromium/WebViewHost.h +++ b/WebKitTools/DumpRenderTree/chromium/WebViewHost.h @@ -33,6 +33,7 @@ #include "MockSpellCheck.h" #include "TestNavigationController.h" +#include "public/WebAccessibilityNotification.h" #include "public/WebCursorInfo.h" #include "public/WebFrameClient.h" #include "public/WebViewClient.h" @@ -127,7 +128,7 @@ class WebViewHost : public WebKit::WebViewClient, public WebKit::WebFrameClient, virtual int historyBackListCount(); virtual int historyForwardListCount(); virtual void focusAccessibilityObject(const WebKit::WebAccessibilityObject&); - virtual void didChangeAccessibilityObjectChildren(const WebKit::WebAccessibilityObject&); + virtual void postAccessibilityNotification(const WebKit::WebAccessibilityObject&, WebKit::WebAccessibilityNotification); virtual WebKit::WebNotificationPresenter* notificationPresenter(); virtual WebKit::WebGeolocationService* geolocationService(); virtual WebKit::WebSpeechInputController* speechInputController(WebKit::WebSpeechInputListener*); diff --git a/WebKitTools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp b/WebKitTools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp index a5c5e9f..d39ff1e 100644 --- a/WebKitTools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp +++ b/WebKitTools/DumpRenderTree/gtk/AccessibilityUIElementGtk.cpp @@ -667,6 +667,12 @@ bool AccessibilityUIElement::isCollapsed() const return false; } +bool AccessibilityUIElement::isIgnored() const +{ + // FIXME: implement + return false; +} + bool AccessibilityUIElement::hasPopup() const { // FIXME: implement diff --git a/WebKitTools/DumpRenderTree/gtk/EventSender.cpp b/WebKitTools/DumpRenderTree/gtk/EventSender.cpp index fc118bc..d1529db 100644 --- a/WebKitTools/DumpRenderTree/gtk/EventSender.cpp +++ b/WebKitTools/DumpRenderTree/gtk/EventSender.cpp @@ -42,6 +42,7 @@ #include <webkit/webkitwebview.h> #include <wtf/ASCIICType.h> #include <wtf/Platform.h> +#include <wtf/text/CString.h> #include <gdk/gdk.h> #include <gdk/gdkkeysyms.h> @@ -49,6 +50,7 @@ extern "C" { extern void webkit_web_frame_layout(WebKitWebFrame* frame); + extern GtkMenu* webkit_web_view_get_context_menu(WebKitWebView*); } static bool dragMode; @@ -148,15 +150,37 @@ bool prepareMouseButtonEvent(GdkEvent* event, int eventSenderButtonNumber, guint static JSValueRef contextClickCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { GdkEvent* pressEvent = gdk_event_new(GDK_BUTTON_PRESS); + if (!prepareMouseButtonEvent(pressEvent, 2, 0)) - return JSValueMakeUndefined(context); + return JSObjectMakeArray(context, 0, 0, 0); GdkEvent* releaseEvent = gdk_event_copy(pressEvent); sendOrQueueEvent(pressEvent); + + JSValueRef valueRef = JSObjectMakeArray(context, 0, 0, 0); + WebKitWebView* view = webkit_web_frame_get_web_view(mainFrame); + GtkMenu* gtkMenu = webkit_web_view_get_context_menu(view); + if (gtkMenu) { + GList* items = gtk_container_get_children(GTK_CONTAINER(gtkMenu)); + JSValueRef arrayValues[g_list_length(items)]; + int index = 0; + for (GList* item = g_list_first(items); item; item = g_list_next(item)) { + CString label; + if (GTK_IS_SEPARATOR_MENU_ITEM(item->data)) + label = "<separator>"; + else + label = gtk_menu_item_get_label(GTK_MENU_ITEM(item->data)); + + arrayValues[index] = JSValueMakeString(context, JSStringCreateWithUTF8CString(label.data())); + index++; + } + if (index) + valueRef = JSObjectMakeArray(context, index - 1, arrayValues, 0); + } + releaseEvent->type = GDK_BUTTON_RELEASE; sendOrQueueEvent(releaseEvent); - - return JSValueMakeUndefined(context); + return valueRef; } static void updateClickCount(int button) @@ -434,30 +458,7 @@ static JSValueRef keyDownCallback(JSContextRef context, JSObjectRef function, JS { if (argumentCount < 1) return JSValueMakeUndefined(context); - - static const JSStringRef lengthProperty = JSStringCreateWithUTF8CString("length"); - - webkit_web_frame_layout(mainFrame); - - // handle modifier keys. - int state = 0; - if (argumentCount > 1) { - JSObjectRef modifiersArray = JSValueToObject(context, arguments[1], exception); - if (modifiersArray) { - for (int i = 0; i < JSValueToNumber(context, JSObjectGetProperty(context, modifiersArray, lengthProperty, 0), 0); ++i) { - JSValueRef value = JSObjectGetPropertyAtIndex(context, modifiersArray, i, 0); - JSStringRef string = JSValueToStringCopy(context, value, 0); - if (JSStringIsEqualToUTF8CString(string, "ctrlKey")) - state |= GDK_CONTROL_MASK; - else if (JSStringIsEqualToUTF8CString(string, "shiftKey")) - state |= GDK_SHIFT_MASK; - else if (JSStringIsEqualToUTF8CString(string, "altKey")) - state |= GDK_MOD1_MASK; - - JSStringRelease(string); - } - } - } + guint modifiers = argumentCount >= 2 ? gdkModifersFromJSValue(context, arguments[1]) : 0; // handle location argument. int location = DOM_KEY_LOCATION_STANDARD; @@ -550,7 +551,7 @@ static JSValueRef keyDownCallback(JSContextRef context, JSObjectRef function, JS else { gdkKeySym = gdk_unicode_to_keyval(charCode); if (WTF::isASCIIUpper(charCode)) - state |= GDK_SHIFT_MASK; + modifiers |= GDK_SHIFT_MASK; } } } @@ -563,7 +564,7 @@ static JSValueRef keyDownCallback(JSContextRef context, JSObjectRef function, JS // create and send the event GdkEvent* pressEvent = gdk_event_new(GDK_KEY_PRESS); pressEvent->key.keyval = gdkKeySym; - pressEvent->key.state = state; + pressEvent->key.state = modifiers; pressEvent->key.window = gtk_widget_get_window(GTK_WIDGET(view)); g_object_ref(pressEvent->key.window); #ifndef GTK_API_VERSION_2 diff --git a/WebKitTools/DumpRenderTree/mac/AccessibilityUIElementMac.mm b/WebKitTools/DumpRenderTree/mac/AccessibilityUIElementMac.mm index fa4acf5..5f9705a 100644 --- a/WebKitTools/DumpRenderTree/mac/AccessibilityUIElementMac.mm +++ b/WebKitTools/DumpRenderTree/mac/AccessibilityUIElementMac.mm @@ -1160,6 +1160,15 @@ bool AccessibilityUIElement::isCollapsed() const return false; } +bool AccessibilityUIElement::isIgnored() const +{ + BOOL result = NO; + BEGIN_AX_OBJC_EXCEPTIONS + result = [m_element accessibilityIsIgnored]; + END_AX_OBJC_EXCEPTIONS + return result; +} + bool AccessibilityUIElement::hasPopup() const { BEGIN_AX_OBJC_EXCEPTIONS @@ -1246,6 +1255,16 @@ AccessibilityTextMarker AccessibilityUIElement::endTextMarkerForTextMarkerRange( return 0; } +AccessibilityTextMarker AccessibilityUIElement::textMarkerForPoint(int x, int y) +{ + BEGIN_AX_OBJC_EXCEPTIONS + id textMarker = [m_element accessibilityAttributeValue:@"AXTextMarkerForPosition" forParameter:[NSValue valueWithPoint:NSMakePoint(x, y)]]; + return AccessibilityTextMarker(textMarker); + END_AX_OBJC_EXCEPTIONS + + return 0; +} + AccessibilityUIElement AccessibilityUIElement::accessibilityElementForTextMarker(AccessibilityTextMarker* marker) { BEGIN_AX_OBJC_EXCEPTIONS diff --git a/WebKitTools/DumpRenderTree/mac/DumpRenderTree.mm b/WebKitTools/DumpRenderTree/mac/DumpRenderTree.mm index ffcb18a..3732247 100644 --- a/WebKitTools/DumpRenderTree/mac/DumpRenderTree.mm +++ b/WebKitTools/DumpRenderTree/mac/DumpRenderTree.mm @@ -457,6 +457,7 @@ static void resetDefaultsToConsistentValues() [preferences setUsesPageCache:NO]; [preferences setAcceleratedCompositingEnabled:YES]; [preferences setWebGLEnabled:NO]; + [preferences setUsePreHTML5ParserQuirks:NO]; [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain]; diff --git a/WebKitTools/DumpRenderTree/qt/DumpRenderTreeQt.cpp b/WebKitTools/DumpRenderTree/qt/DumpRenderTreeQt.cpp index 00ccdb5..4e6f049 100644 --- a/WebKitTools/DumpRenderTree/qt/DumpRenderTreeQt.cpp +++ b/WebKitTools/DumpRenderTree/qt/DumpRenderTreeQt.cpp @@ -567,6 +567,13 @@ void DumpRenderTree::resetToConsistentStateBeforeTesting() setlocale(LC_ALL, ""); } +static bool isGlobalHistoryTest(const QUrl& url) +{ + if (url.path().contains("globalhistory/")) + return true; + return false; +} + static bool isWebInspectorTest(const QUrl& url) { if (url.path().contains("inspector/")) @@ -595,6 +602,9 @@ void DumpRenderTree::open(const QUrl& url) layoutTestController()->showWebInspector(); } + if (isGlobalHistoryTest(url)) + layoutTestController()->dumpHistoryCallbacks(); + // W3C SVG tests expect to be 480x360 bool isW3CTest = url.toString().contains("svg/W3C-SVG-1.1"); int width = isW3CTest ? 480 : LayoutTestController::maxViewWidth; @@ -668,8 +678,10 @@ void DumpRenderTree::processArgsLine(const QStringList &args) void DumpRenderTree::loadNextTestInStandAloneMode() { - if (m_standAloneModeTestList.isEmpty()) + if (m_standAloneModeTestList.isEmpty()) { emit quit(); + return; + } processLine(m_standAloneModeTestList.first()); m_standAloneModeTestList.removeFirst(); diff --git a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp index b783141..b2ef716 100644 --- a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp +++ b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp @@ -81,6 +81,8 @@ void LayoutTestController::reset() DumpRenderTreeSupportQt::setWillSendRequestClearHeaders(QStringList()); DumpRenderTreeSupportQt::clearScriptWorlds(); DumpRenderTreeSupportQt::setCustomPolicyDelegate(false, false); + DumpRenderTreeSupportQt::dumpHistoryCallbacks(false); + DumpRenderTreeSupportQt::dumpVisitedLinksCallbacks(false); setIconDatabaseEnabled(false); emit hidePage(); @@ -206,6 +208,11 @@ bool LayoutTestController::checkDesktopNotificationPermission(const QString& ori return !m_ignoreDesktopNotification && m_desktopNotificationAllowedOrigins.contains(origin); } +void LayoutTestController::simulateDesktopNotificationClick(const QString& title) +{ + DumpRenderTreeSupportQt::simulateDesktopNotificationClick(title); +} + void LayoutTestController::display() { emit showPage(); @@ -222,6 +229,12 @@ QString LayoutTestController::pathToLocalResource(const QString& url) return QDir::toNativeSeparators(url); } +void LayoutTestController::dumpConfigurationForViewport(int availableWidth, int availableHeight) +{ + QString res = DumpRenderTreeSupportQt::viewportAsText(m_drt->webPage(), QSize(availableWidth, availableHeight)); + fputs(qPrintable(res), stdout); +} + void LayoutTestController::dumpEditingCallbacks() { qDebug() << ">>>dumpEditingCallbacks"; @@ -243,6 +256,11 @@ void LayoutTestController::dumpResourceResponseMIMETypes() DumpRenderTreeSupportQt::dumpResourceResponseMIMETypes(true); } +void LayoutTestController::dumpHistoryCallbacks() +{ + DumpRenderTreeSupportQt::dumpHistoryCallbacks(true); +} + void LayoutTestController::setWillSendRequestReturnsNullOnRedirect(bool enabled) { DumpRenderTreeSupportQt::setWillSendRequestReturnsNullOnRedirect(enabled); @@ -769,5 +787,12 @@ void LayoutTestController::addUserStyleSheet(const QString& sourceCode) DumpRenderTreeSupportQt::addUserStyleSheet(m_drt->webPage(), sourceCode); } +void LayoutTestController::removeAllVisitedLinks() +{ + QWebHistory* history = m_drt->webPage()->history(); + history->clear(); + DumpRenderTreeSupportQt::dumpVisitedLinksCallbacks(true); +} + const unsigned LayoutTestController::maxViewWidth = 800; const unsigned LayoutTestController::maxViewHeight = 600; diff --git a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.h b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.h index 7e58f44..ec89acb 100644 --- a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.h +++ b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.h @@ -108,6 +108,8 @@ public slots: void dumpFrameLoadCallbacks(); void dumpResourceLoadCallbacks(); void dumpResourceResponseMIMETypes(); + void dumpHistoryCallbacks(); + void dumpConfigurationForViewport(int availableWidth, int availableHeight); void setWillSendRequestReturnsNullOnRedirect(bool enabled); void setWillSendRequestReturnsNull(bool enabled); void setWillSendRequestClearHeader(const QStringList& headers); @@ -124,6 +126,7 @@ public slots: void grantDesktopNotificationPermission(const QString& origin); void ignoreDesktopNotificationPermissionRequests(); bool checkDesktopNotificationPermission(const QString& origin); + void simulateDesktopNotificationClick(const QString& title); void display(); void clearBackForwardList(); QString pathToLocalResource(const QString& url); @@ -135,6 +138,7 @@ public slots: void showWebInspector(); void closeWebInspector(); void evaluateInWebInspector(long callId, const QString& script); + void removeAllVisitedLinks(); void setMediaType(const QString& type); void setFrameFlatteningEnabled(bool enable); diff --git a/WebKitTools/DumpRenderTree/win/AccessibilityUIElementWin.cpp b/WebKitTools/DumpRenderTree/win/AccessibilityUIElementWin.cpp index 8c2fea2..96937fd 100644 --- a/WebKitTools/DumpRenderTree/win/AccessibilityUIElementWin.cpp +++ b/WebKitTools/DumpRenderTree/win/AccessibilityUIElementWin.cpp @@ -614,6 +614,12 @@ bool AccessibilityUIElement::isCollapsed() const return (state & STATE_SYSTEM_COLLAPSED) == STATE_SYSTEM_COLLAPSED; } +bool AccessibilityUIElement::isIgnored() const +{ + // FIXME: implement + return false; +} + bool AccessibilityUIElement::hasPopup() const { DWORD state = accessibilityState(m_element); diff --git a/WebKitTools/EWSTools/start-commit-queue.sh b/WebKitTools/EWSTools/start-commit-queue.sh new file mode 100755 index 0000000..998300e --- /dev/null +++ b/WebKitTools/EWSTools/start-commit-queue.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# 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. + +cd "$HOME/Projects/CommitQueue" +while : +do + git reset --hard + git clean -f + git svn rebase + ./WebKitTools/Scripts/webkit-patch commit-queue --no-confirm --exit-after-iteration 10 +done diff --git a/WebKitTools/MiniBrowser/Configurations/MiniBrowserCommon.vsprops b/WebKitTools/MiniBrowser/Configurations/MiniBrowserCommon.vsprops index 7f843ce..0031e14 100644 --- a/WebKitTools/MiniBrowser/Configurations/MiniBrowserCommon.vsprops +++ b/WebKitTools/MiniBrowser/Configurations/MiniBrowserCommon.vsprops @@ -6,7 +6,7 @@ >
<Tool
Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""$(WebKitLibrariesDir)\Include";"$(WebKitOutputDir)\Include""
+ AdditionalIncludeDirectories=""$(WebKitOutputDir)\Include";"$(WebKitLibrariesDir)\Include""
UsePrecompiledHeader="2"
/>
<Tool
diff --git a/WebKitTools/MiniBrowser/mac/AppDelegate.m b/WebKitTools/MiniBrowser/mac/AppDelegate.m index 3bd3d57..7098cea 100644 --- a/WebKitTools/MiniBrowser/mac/AppDelegate.m +++ b/WebKitTools/MiniBrowser/mac/AppDelegate.m @@ -141,7 +141,8 @@ static void populateVisitedLinks(WKContextRef context, const void *clientInfo) WKContextInjectedBundleClient bundleClient = { 0, /* version */ 0, /* clientInfo */ - didRecieveMessageFromInjectedBundle + didRecieveMessageFromInjectedBundle, + 0 }; WKContextSetInjectedBundleClient(processContext, &bundleClient); WKContextSetHistoryClient(processContext, &historyClient); diff --git a/WebKitTools/MiniBrowser/mac/BrowserWindowController.h b/WebKitTools/MiniBrowser/mac/BrowserWindowController.h index aad8240..98c6bf7 100644 --- a/WebKitTools/MiniBrowser/mac/BrowserWindowController.h +++ b/WebKitTools/MiniBrowser/mac/BrowserWindowController.h @@ -34,6 +34,7 @@ WKPageNamespaceRef _pageNamespace; WKView *_webView; + BOOL _zoomTextOnly; } - (IBAction)fetch:(id)sender; - (IBAction)reload:(id)sender; @@ -48,4 +49,15 @@ - (void)loadURLString:(NSString *)urlString; - (void)applicationTerminating; +- (IBAction)zoomIn:(id)sender; +- (IBAction)zoomOut:(id)sender; +- (IBAction)resetZoom:(id)sender; +- (BOOL)canZoomIn; +- (BOOL)canZoomOut; +- (BOOL)canResetZoom; + +- (IBAction)toggleZoomMode:(id)sender; + +- (IBAction)dumpSourceToConsole:(id)sender; + @end diff --git a/WebKitTools/MiniBrowser/mac/BrowserWindowController.m b/WebKitTools/MiniBrowser/mac/BrowserWindowController.m index 0b4e170..9398e56 100644 --- a/WebKitTools/MiniBrowser/mac/BrowserWindowController.m +++ b/WebKitTools/MiniBrowser/mac/BrowserWindowController.m @@ -44,8 +44,10 @@ - (id)initWithPageNamespace:(WKPageNamespaceRef)pageNamespace { - if ((self = [super initWithWindowNibName:@"BrowserWindow"])) + if ((self = [super initWithWindowNibName:@"BrowserWindow"])) { _pageNamespace = WKRetain(pageNamespace); + _zoomTextOnly = NO; + } return self; } @@ -59,6 +61,9 @@ - (IBAction)fetch:(id)sender { CFURLRef cfURL = CFURLCreateWithString(0, (CFStringRef)[urlText stringValue], 0); + if (!cfURL) + return; + WKURLRef url = WKURLCreateWithCFURL(cfURL); CFRelease(cfURL); @@ -86,10 +91,21 @@ - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - if ([menuItem action] == @selector(showHideWebView:)) + SEL action = [menuItem action]; + + if (action == @selector(zoomIn:)) + return [self canZoomIn]; + if (action == @selector(zoomOut:)) + return [self canZoomOut]; + if (action == @selector(resetZoom:)) + return [self canResetZoom]; + + if (action == @selector(showHideWebView:)) [menuItem setTitle:[_webView isHidden] ? @"Show Web View" : @"Hide Web View"]; - else if ([menuItem action] == @selector(removeReinsertWebView:)) + else if (action == @selector(removeReinsertWebView:)) [menuItem setTitle:[_webView window] ? @"Remove Web View" : @"Insert Web View"]; + else if (action == @selector(toggleZoomMode:)) + [menuItem setState:_zoomTextOnly ? NSOnState : NSOffState]; return YES; } @@ -116,7 +132,7 @@ - (BOOL)validateUserInterfaceItem:(id <NSValidatedUserInterfaceItem>)item { SEL action = [item action]; - + if (action == @selector(goBack:)) return _webView && WKPageCanGoBack(_webView.pageRef); @@ -150,56 +166,136 @@ WKRelease(_webView.pageRef); } +#define DefaultMinimumZoomFactor (.5) +#define DefaultMaximumZoomFactor (3.0) +#define DefaultZoomFactorRatio (1.2) + +- (double)currentZoomFactor +{ + return _zoomTextOnly ? WKPageGetTextZoomFactor(_webView.pageRef) : WKPageGetPageZoomFactor(_webView.pageRef); +} + +- (void)setCurrentZoomFactor:(double)factor +{ + _zoomTextOnly ? WKPageSetTextZoomFactor(_webView.pageRef, factor) : WKPageSetPageZoomFactor(_webView.pageRef, factor); +} + +- (BOOL)canZoomIn +{ + return [self currentZoomFactor] * DefaultZoomFactorRatio < DefaultMaximumZoomFactor; +} + +- (void)zoomIn:(id)sender +{ + if (![self canZoomIn]) + return; + + double factor = [self currentZoomFactor] * DefaultZoomFactorRatio; + [self setCurrentZoomFactor:factor]; +} + +- (BOOL)canZoomOut +{ + return [self currentZoomFactor] / DefaultZoomFactorRatio > DefaultMinimumZoomFactor; +} + +- (void)zoomOut:(id)sender +{ + if (![self canZoomIn]) + return; + + double factor = [self currentZoomFactor] / DefaultZoomFactorRatio; + [self setCurrentZoomFactor:factor]; +} + +- (BOOL)canResetZoom +{ + return _zoomTextOnly ? (WKPageGetTextZoomFactor(_webView.pageRef) != 1) : (WKPageGetPageZoomFactor(_webView.pageRef) != 1); +} + +- (void)resetZoom:(id)sender +{ + if (![self canResetZoom]) + return; + + if (_zoomTextOnly) + WKPageSetTextZoomFactor(_webView.pageRef, 1); + else + WKPageSetPageZoomFactor(_webView.pageRef, 1); +} + +- (IBAction)toggleZoomMode:(id)sender +{ + if (_zoomTextOnly) { + _zoomTextOnly = NO; + double currentTextZoom = WKPageGetTextZoomFactor(_webView.pageRef); + WKPageSetPageAndTextZoomFactors(_webView.pageRef, currentTextZoom, 1); + } else { + _zoomTextOnly = YES; + double currentPageZoom = WKPageGetPageZoomFactor(_webView.pageRef); + WKPageSetPageAndTextZoomFactors(_webView.pageRef, 1, currentPageZoom); + } +} + +- (IBAction)dumpSourceToConsole:(id)sender +{ + WKPageGetSourceForFrame_b(_webView.pageRef, WKPageGetMainFrame(_webView.pageRef), ^(WKStringRef result, WKErrorRef error) { + CFStringRef cfResult = WKStringCopyCFString(0, result); + LOG(@"Main frame source\n \"%@\"", (NSString *)cfResult); + CFRelease(cfResult); + }); +} + #pragma mark Loader Client Callbacks -static void didStartProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, const void *clientInfo) +static void didStartProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo) { [(BrowserWindowController *)clientInfo didStartProvisionalLoadForFrame:frame]; } -static void didReceiveServerRedirectForProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, const void *clientInfo) +static void didReceiveServerRedirectForProvisionalLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo) { [(BrowserWindowController *)clientInfo didReceiveServerRedirectForProvisionalLoadForFrame:frame]; } -static void didFailProvisionalLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, const void *clientInfo) +static void didFailProvisionalLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo) { [(BrowserWindowController *)clientInfo didFailProvisionalLoadWithErrorForFrame:frame]; } -static void didCommitLoadForFrame(WKPageRef page, WKFrameRef frame, const void *clientInfo) +static void didCommitLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo) { [(BrowserWindowController *)clientInfo didCommitLoadForFrame:frame]; } -static void didFinishDocumentLoadForFrame(WKPageRef page, WKFrameRef frame, const void *clientInfo) +static void didFinishDocumentLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo) { LOG(@"didFinishDocumentLoadForFrame"); } -static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, const void *clientInfo) +static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo) { LOG(@"didFinishLoadForFrame"); } -static void didFailLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, const void *clientInfo) +static void didFailLoadWithErrorForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo) { [(BrowserWindowController *)clientInfo didFailLoadWithErrorForFrame:frame]; } -static void didReceiveTitleForFrame(WKPageRef page, WKStringRef title, WKFrameRef frame, const void *clientInfo) +static void didReceiveTitleForFrame(WKPageRef page, WKStringRef title, WKFrameRef frame, WKTypeRef userData, const void *clientInfo) { CFStringRef cfTitle = WKStringCopyCFString(0, title); LOG(@"didReceiveTitleForFrame \"%@\"", (NSString *)cfTitle); CFRelease(cfTitle); } -static void didFirstLayoutForFrame(WKPageRef page, WKFrameRef frame, const void *clientInfo) +static void didFirstLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo) { LOG(@"didFirstLayoutForFrame"); } -static void didFirstVisuallyNonEmptyLayoutForFrame(WKPageRef page, WKFrameRef frame, const void *clientInfo) +static void didFirstVisuallyNonEmptyLayoutForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void *clientInfo) { LOG(@"didFirstVisuallyNonEmptyLayoutForFrame"); } @@ -241,13 +337,13 @@ static void didChangeBackForwardList(WKPageRef page, const void *clientInfo) #pragma mark Policy Client Callbacks -static void decidePolicyForNavigationAction(WKPageRef page, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKURLRef url, WKFrameRef frame, WKFramePolicyListenerRef listener, const void *clientInfo) +static void decidePolicyForNavigationAction(WKPageRef page, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRef url, WKFrameRef frame, WKFramePolicyListenerRef listener, const void *clientInfo) { LOG(@"decidePolicyForNavigationAction"); WKFramePolicyListenerUse(listener); } -static void decidePolicyForNewWindowAction(WKPageRef page, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKURLRef url, WKFrameRef frame, WKFramePolicyListenerRef listener, const void *clientInfo) +static void decidePolicyForNewWindowAction(WKPageRef page, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRef url, WKFrameRef frame, WKFramePolicyListenerRef listener, const void *clientInfo) { LOG(@"decidePolicyForNewWindowAction"); WKFramePolicyListenerUse(listener); @@ -368,6 +464,16 @@ static WKStringRef runJavaScriptPrompt(WKPageRef page, WKStringRef message, WKSt return WKStringCreateWithCFString((CFStringRef)result); } +static void setStatusText(WKPageRef page, WKStringRef text, const void* clientInfo) +{ + LOG(@"setStatusText"); +} + +static void contentsSizeChanged(WKPageRef page, int width, int height, WKFrameRef frame, const void *clientInfo) +{ + LOG(@"contentsSizeChanged"); +} + - (void)awakeFromNib { _webView = [[WKView alloc] initWithFrame:[containerView frame] pageNamespaceRef:_pageNamespace]; @@ -418,7 +524,8 @@ static WKStringRef runJavaScriptPrompt(WKPageRef page, WKStringRef message, WKSt runJavaScriptAlert, runJavaScriptConfirm, runJavaScriptPrompt, - 0 /* contentsSizeChanged */ + setStatusText, + contentsSizeChanged }; WKPageSetPageUIClient(_webView.pageRef, &uiClient); } diff --git a/WebKitTools/MiniBrowser/mac/MainMenu.xib b/WebKitTools/MiniBrowser/mac/MainMenu.xib index 229611c..634f615 100644 --- a/WebKitTools/MiniBrowser/mac/MainMenu.xib +++ b/WebKitTools/MiniBrowser/mac/MainMenu.xib @@ -2,13 +2,13 @@ <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> <data> <int key="IBDocument.SystemTarget">1060</int> - <string key="IBDocument.SystemVersion">10D573</string> - <string key="IBDocument.InterfaceBuilderVersion">762</string> + <string key="IBDocument.SystemVersion">10F569</string> + <string key="IBDocument.InterfaceBuilderVersion">788</string> <string key="IBDocument.AppKitVersion">1038.29</string> - <string key="IBDocument.HIToolboxVersion">460.00</string> + <string key="IBDocument.HIToolboxVersion">461.00</string> <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="NS.object.0">762</string> + <string key="NS.object.0">788</string> </object> <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -713,490 +713,6 @@ </object> </object> </object> - <object class="NSMenuItem" id="302598603"> - <reference key="NSMenu" ref="649796088"/> - <string key="NSTitle">Format</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="941447902"> - <string key="NSTitle">Format</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="792887677"> - <reference key="NSMenu" ref="941447902"/> - <string key="NSTitle">Font</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="786677654"> - <string key="NSTitle">Font</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="159677712"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Show Fonts</string> - <string key="NSKeyEquiv">t</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="305399458"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Bold</string> - <string key="NSKeyEquiv">b</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <int key="NSTag">2</int> - </object> - <object class="NSMenuItem" id="814362025"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Italic</string> - <string key="NSKeyEquiv">i</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <int key="NSTag">1</int> - </object> - <object class="NSMenuItem" id="330926929"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Underline</string> - <string key="NSKeyEquiv">u</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="533507878"> - <reference key="NSMenu" ref="786677654"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="158063935"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Bigger</string> - <string key="NSKeyEquiv">+</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <int key="NSTag">3</int> - </object> - <object class="NSMenuItem" id="885547335"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Smaller</string> - <string key="NSKeyEquiv">-</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <int key="NSTag">4</int> - </object> - <object class="NSMenuItem" id="901062459"> - <reference key="NSMenu" ref="786677654"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="767671776"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Kern</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="175441468"> - <string key="NSTitle">Kern</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="252969304"> - <reference key="NSMenu" ref="175441468"/> - <string key="NSTitle">Use Default</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="766922938"> - <reference key="NSMenu" ref="175441468"/> - <string key="NSTitle">Use None</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="677519740"> - <reference key="NSMenu" ref="175441468"/> - <string key="NSTitle">Tighten</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="238351151"> - <reference key="NSMenu" ref="175441468"/> - <string key="NSTitle">Loosen</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="691570813"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Ligature</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="1058217995"> - <string key="NSTitle">Ligature</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="706297211"> - <reference key="NSMenu" ref="1058217995"/> - <string key="NSTitle">Use Default</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="568384683"> - <reference key="NSMenu" ref="1058217995"/> - <string key="NSTitle">Use None</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="663508465"> - <reference key="NSMenu" ref="1058217995"/> - <string key="NSTitle">Use All</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="769124883"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Baseline</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="18263474"> - <string key="NSTitle">Baseline</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="257962622"> - <reference key="NSMenu" ref="18263474"/> - <string key="NSTitle">Use Default</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="644725453"> - <reference key="NSMenu" ref="18263474"/> - <string key="NSTitle">Superscript</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="1037576581"> - <reference key="NSMenu" ref="18263474"/> - <string key="NSTitle">Subscript</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="941806246"> - <reference key="NSMenu" ref="18263474"/> - <string key="NSTitle">Raise</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="1045724900"> - <reference key="NSMenu" ref="18263474"/> - <string key="NSTitle">Lower</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="739652853"> - <reference key="NSMenu" ref="786677654"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="1012600125"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Show Colors</string> - <string key="NSKeyEquiv">C</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="214559597"> - <reference key="NSMenu" ref="786677654"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="596732606"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Copy Style</string> - <string key="NSKeyEquiv">c</string> - <int key="NSKeyEquivModMask">1572864</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="393423671"> - <reference key="NSMenu" ref="786677654"/> - <string key="NSTitle">Paste Style</string> - <string key="NSKeyEquiv">v</string> - <int key="NSKeyEquivModMask">1572864</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - </object> - <string key="NSName">_NSFontMenu</string> - </object> - </object> - <object class="NSMenuItem" id="215659978"> - <reference key="NSMenu" ref="941447902"/> - <string key="NSTitle">Text</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="446991534"> - <string key="NSTitle">Text</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="875092757"> - <reference key="NSMenu" ref="446991534"/> - <string key="NSTitle">Align Left</string> - <string key="NSKeyEquiv">{</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="630155264"> - <reference key="NSMenu" ref="446991534"/> - <string key="NSTitle">Center</string> - <string key="NSKeyEquiv">|</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="945678886"> - <reference key="NSMenu" ref="446991534"/> - <string key="NSTitle">Justify</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="512868991"> - <reference key="NSMenu" ref="446991534"/> - <string key="NSTitle">Align Right</string> - <string key="NSKeyEquiv">}</string> - <int key="NSKeyEquivModMask">1048576</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="163117631"> - <reference key="NSMenu" ref="446991534"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="31516759"> - <reference key="NSMenu" ref="446991534"/> - <string key="NSTitle">Writing Direction</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - <string key="NSAction">submenuAction:</string> - <object class="NSMenu" key="NSSubmenu" id="956096989"> - <string key="NSTitle">Writing Direction</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSMenuItem" id="257099033"> - <reference key="NSMenu" ref="956096989"/> - <bool key="NSIsDisabled">YES</bool> - <string key="NSTitle">Paragraph</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="551969625"> - <reference key="NSMenu" ref="956096989"/> - <string type="base64-UTF8" key="NSTitle">CURlZmF1bHQ</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="249532473"> - <reference key="NSMenu" ref="956096989"/> - <string type="base64-UTF8" key="NSTitle">CUxlZnQgdG8gUmlnaHQ</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="607364498"> - <reference key="NSMenu" ref="956096989"/> - <string type="base64-UTF8" key="NSTitle">CVJpZ2h0IHRvIExlZnQ</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="508151438"> - <reference key="NSMenu" ref="956096989"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="981751889"> - <reference key="NSMenu" ref="956096989"/> - <bool key="NSIsDisabled">YES</bool> - <string key="NSTitle">Selection</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="380031999"> - <reference key="NSMenu" ref="956096989"/> - <string type="base64-UTF8" key="NSTitle">CURlZmF1bHQ</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="825984362"> - <reference key="NSMenu" ref="956096989"/> - <string type="base64-UTF8" key="NSTitle">CUxlZnQgdG8gUmlnaHQ</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="560145579"> - <reference key="NSMenu" ref="956096989"/> - <string type="base64-UTF8" key="NSTitle">CVJpZ2h0IHRvIExlZnQ</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - </object> - </object> - </object> - <object class="NSMenuItem" id="908105787"> - <reference key="NSMenu" ref="446991534"/> - <bool key="NSIsDisabled">YES</bool> - <bool key="NSIsSeparator">YES</bool> - <string key="NSTitle"/> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="644046920"> - <reference key="NSMenu" ref="446991534"/> - <string key="NSTitle">Show Ruler</string> - <string key="NSKeyEquiv"/> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="231811626"> - <reference key="NSMenu" ref="446991534"/> - <string key="NSTitle">Copy Ruler</string> - <string key="NSKeyEquiv">c</string> - <int key="NSKeyEquivModMask">1310720</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - <object class="NSMenuItem" id="883618387"> - <reference key="NSMenu" ref="446991534"/> - <string key="NSTitle">Paste Ruler</string> - <string key="NSKeyEquiv">v</string> - <int key="NSKeyEquivModMask">1310720</int> - <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="35465992"/> - <reference key="NSMixedImage" ref="502551668"/> - </object> - </object> - </object> - </object> - </object> - </object> - </object> <object class="NSMenuItem" id="586577488"> <reference key="NSMenu" ref="649796088"/> <string key="NSTitle">View</string> @@ -1228,6 +744,51 @@ <reference key="NSOnImage" ref="35465992"/> <reference key="NSMixedImage" ref="502551668"/> </object> + <object class="NSMenuItem" id="1025359947"> + <reference key="NSMenu" ref="466310130"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="694544109"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Zoom In</string> + <string key="NSKeyEquiv">+</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="943694335"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Zoom Out</string> + <string key="NSKeyEquiv">-</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="863984465"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Reset Zoom</string> + <string key="NSKeyEquiv">0</string> + <int key="NSKeyEquivModMask">1048576</int> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="138443116"> + <reference key="NSMenu" ref="466310130"/> + <string key="NSTitle">Zoom Text Only</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> </object> </object> </object> @@ -1407,6 +968,24 @@ </object> </object> </object> + <object class="NSMenuItem" id="377902755"> + <reference key="NSMenu" ref="865232259"/> + <bool key="NSIsDisabled">YES</bool> + <bool key="NSIsSeparator">YES</bool> + <string key="NSTitle"/> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> + <object class="NSMenuItem" id="191469404"> + <reference key="NSMenu" ref="865232259"/> + <string key="NSTitle">Dump Source To Console</string> + <string key="NSKeyEquiv"/> + <int key="NSMnemonicLoc">2147483647</int> + <reference key="NSOnImage" ref="35465992"/> + <reference key="NSMixedImage" ref="502551668"/> + </object> </object> </object> </object> @@ -1705,174 +1284,6 @@ </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">addFontTrait:</string> - <reference key="source" ref="755631768"/> - <reference key="destination" ref="305399458"/> - </object> - <int key="connectionID">421</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">addFontTrait:</string> - <reference key="source" ref="755631768"/> - <reference key="destination" ref="814362025"/> - </object> - <int key="connectionID">422</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">modifyFont:</string> - <reference key="source" ref="755631768"/> - <reference key="destination" ref="885547335"/> - </object> - <int key="connectionID">423</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">orderFrontFontPanel:</string> - <reference key="source" ref="755631768"/> - <reference key="destination" ref="159677712"/> - </object> - <int key="connectionID">424</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">modifyFont:</string> - <reference key="source" ref="755631768"/> - <reference key="destination" ref="158063935"/> - </object> - <int key="connectionID">425</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">raiseBaseline:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="941806246"/> - </object> - <int key="connectionID">426</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">lowerBaseline:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="1045724900"/> - </object> - <int key="connectionID">427</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">copyFont:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="596732606"/> - </object> - <int key="connectionID">428</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">subscript:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="1037576581"/> - </object> - <int key="connectionID">429</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">superscript:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="644725453"/> - </object> - <int key="connectionID">430</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">tightenKerning:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="677519740"/> - </object> - <int key="connectionID">431</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">underline:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="330926929"/> - </object> - <int key="connectionID">432</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">orderFrontColorPanel:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="1012600125"/> - </object> - <int key="connectionID">433</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">useAllLigatures:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="663508465"/> - </object> - <int key="connectionID">434</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">loosenKerning:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="238351151"/> - </object> - <int key="connectionID">435</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">pasteFont:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="393423671"/> - </object> - <int key="connectionID">436</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">unscript:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="257962622"/> - </object> - <int key="connectionID">437</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">useStandardKerning:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="252969304"/> - </object> - <int key="connectionID">438</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">useStandardLigatures:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="706297211"/> - </object> - <int key="connectionID">439</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">turnOffLigatures:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="568384683"/> - </object> - <int key="connectionID">440</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">turnOffKerning:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="766922938"/> - </object> - <int key="connectionID">441</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> <string key="label">terminate:</string> <reference key="source" ref="1050"/> <reference key="destination" ref="632727374"/> @@ -1985,163 +1396,99 @@ </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">alignCenter:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="630155264"/> - </object> - <int key="connectionID">518</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">pasteRuler:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="883618387"/> - </object> - <int key="connectionID">519</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">toggleRuler:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="644046920"/> - </object> - <int key="connectionID">520</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">alignRight:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="512868991"/> - </object> - <int key="connectionID">521</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">copyRuler:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="231811626"/> - </object> - <int key="connectionID">522</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">alignJustified:</string> + <string key="label">newWindow:</string> <reference key="source" ref="1014"/> - <reference key="destination" ref="945678886"/> + <reference key="destination" ref="705341025"/> </object> - <int key="connectionID">523</int> + <int key="connectionID">533</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">alignLeft:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="875092757"/> + <string key="label">setSharedProcessProcessModel:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="993856752"/> </object> - <int key="connectionID">524</int> + <int key="connectionID">543</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">makeBaseWritingDirectionNatural:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="551969625"/> + <string key="label">setSharedThreadProcessModel:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="516840223"/> </object> - <int key="connectionID">525</int> + <int key="connectionID">544</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">makeBaseWritingDirectionLeftToRight:</string> + <string key="label">forceRepaint:</string> <reference key="source" ref="1014"/> - <reference key="destination" ref="249532473"/> + <reference key="destination" ref="878165919"/> </object> - <int key="connectionID">526</int> + <int key="connectionID">547</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">makeBaseWritingDirectionRightToLeft:</string> + <string key="label">showHideWebView:</string> <reference key="source" ref="1014"/> - <reference key="destination" ref="607364498"/> + <reference key="destination" ref="137933275"/> </object> - <int key="connectionID">527</int> + <int key="connectionID">549</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">makeTextWritingDirectionNatural:</string> + <string key="label">removeReinsertWebView:</string> <reference key="source" ref="1014"/> - <reference key="destination" ref="380031999"/> + <reference key="destination" ref="1027125810"/> </object> - <int key="connectionID">528</int> + <int key="connectionID">551</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">makeTextWritingDirectionLeftToRight:</string> - <reference key="source" ref="1014"/> - <reference key="destination" ref="825984362"/> + <string key="label">showStatisticsWindow:</string> + <reference key="source" ref="976324537"/> + <reference key="destination" ref="208343368"/> </object> - <int key="connectionID">529</int> + <int key="connectionID">554</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">makeTextWritingDirectionRightToLeft:</string> + <string key="label">zoomIn:</string> <reference key="source" ref="1014"/> - <reference key="destination" ref="560145579"/> + <reference key="destination" ref="694544109"/> </object> - <int key="connectionID">530</int> + <int key="connectionID">559</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">newWindow:</string> + <string key="label">zoomOut:</string> <reference key="source" ref="1014"/> - <reference key="destination" ref="705341025"/> - </object> - <int key="connectionID">533</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">setSharedProcessProcessModel:</string> - <reference key="source" ref="976324537"/> - <reference key="destination" ref="993856752"/> + <reference key="destination" ref="943694335"/> </object> - <int key="connectionID">543</int> + <int key="connectionID">560</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">setSharedThreadProcessModel:</string> - <reference key="source" ref="976324537"/> - <reference key="destination" ref="516840223"/> - </object> - <int key="connectionID">544</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">forceRepaint:</string> + <string key="label">resetZoom:</string> <reference key="source" ref="1014"/> - <reference key="destination" ref="878165919"/> + <reference key="destination" ref="863984465"/> </object> - <int key="connectionID">547</int> + <int key="connectionID">561</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">showHideWebView:</string> + <string key="label">toggleZoomMode:</string> <reference key="source" ref="1014"/> - <reference key="destination" ref="137933275"/> + <reference key="destination" ref="138443116"/> </object> - <int key="connectionID">549</int> + <int key="connectionID">564</int> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">removeReinsertWebView:</string> + <string key="label">dumpSourceToConsole:</string> <reference key="source" ref="1014"/> - <reference key="destination" ref="1027125810"/> + <reference key="destination" ref="191469404"/> </object> - <int key="connectionID">551</int> - </object> - <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">showStatisticsWindow:</string> - <reference key="source" ref="976324537"/> - <reference key="destination" ref="208343368"/> - </object> - <int key="connectionID">554</int> + <int key="connectionID">567</int> </object> </object> <object class="IBMutableOrderedSet" key="objectRecords"> @@ -2181,7 +1528,6 @@ <reference ref="952259628"/> <reference ref="379814623"/> <reference ref="586577488"/> - <reference ref="302598603"/> <reference ref="448692316"/> <reference ref="816668511"/> </object> @@ -2599,6 +1945,11 @@ <bool key="EncodedWithXMLCoder">YES</bool> <reference ref="102151532"/> <reference ref="237841660"/> + <reference ref="694544109"/> + <reference ref="1025359947"/> + <reference ref="943694335"/> + <reference ref="863984465"/> + <reference ref="138443116"/> </object> <reference key="parent" ref="586577488"/> </object> @@ -2686,246 +2037,6 @@ <reference key="parent" ref="698887838"/> </object> <object class="IBObjectRecord"> - <int key="objectID">375</int> - <reference key="object" ref="302598603"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="941447902"/> - </object> - <reference key="parent" ref="649796088"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">376</int> - <reference key="object" ref="941447902"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="792887677"/> - <reference ref="215659978"/> - </object> - <reference key="parent" ref="302598603"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">377</int> - <reference key="object" ref="792887677"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="786677654"/> - </object> - <reference key="parent" ref="941447902"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">388</int> - <reference key="object" ref="786677654"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="159677712"/> - <reference ref="305399458"/> - <reference ref="814362025"/> - <reference ref="330926929"/> - <reference ref="533507878"/> - <reference ref="158063935"/> - <reference ref="885547335"/> - <reference ref="901062459"/> - <reference ref="767671776"/> - <reference ref="691570813"/> - <reference ref="769124883"/> - <reference ref="739652853"/> - <reference ref="1012600125"/> - <reference ref="214559597"/> - <reference ref="596732606"/> - <reference ref="393423671"/> - </object> - <reference key="parent" ref="792887677"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">389</int> - <reference key="object" ref="159677712"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">390</int> - <reference key="object" ref="305399458"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">391</int> - <reference key="object" ref="814362025"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">392</int> - <reference key="object" ref="330926929"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">393</int> - <reference key="object" ref="533507878"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">394</int> - <reference key="object" ref="158063935"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">395</int> - <reference key="object" ref="885547335"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">396</int> - <reference key="object" ref="901062459"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">397</int> - <reference key="object" ref="767671776"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="175441468"/> - </object> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">398</int> - <reference key="object" ref="691570813"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1058217995"/> - </object> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">399</int> - <reference key="object" ref="769124883"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="18263474"/> - </object> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">400</int> - <reference key="object" ref="739652853"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">401</int> - <reference key="object" ref="1012600125"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">402</int> - <reference key="object" ref="214559597"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">403</int> - <reference key="object" ref="596732606"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">404</int> - <reference key="object" ref="393423671"/> - <reference key="parent" ref="786677654"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">405</int> - <reference key="object" ref="18263474"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="257962622"/> - <reference ref="644725453"/> - <reference ref="1037576581"/> - <reference ref="941806246"/> - <reference ref="1045724900"/> - </object> - <reference key="parent" ref="769124883"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">406</int> - <reference key="object" ref="257962622"/> - <reference key="parent" ref="18263474"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">407</int> - <reference key="object" ref="644725453"/> - <reference key="parent" ref="18263474"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">408</int> - <reference key="object" ref="1037576581"/> - <reference key="parent" ref="18263474"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">409</int> - <reference key="object" ref="941806246"/> - <reference key="parent" ref="18263474"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">410</int> - <reference key="object" ref="1045724900"/> - <reference key="parent" ref="18263474"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">411</int> - <reference key="object" ref="1058217995"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="706297211"/> - <reference ref="568384683"/> - <reference ref="663508465"/> - </object> - <reference key="parent" ref="691570813"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">412</int> - <reference key="object" ref="706297211"/> - <reference key="parent" ref="1058217995"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">413</int> - <reference key="object" ref="568384683"/> - <reference key="parent" ref="1058217995"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">414</int> - <reference key="object" ref="663508465"/> - <reference key="parent" ref="1058217995"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">415</int> - <reference key="object" ref="175441468"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="252969304"/> - <reference ref="766922938"/> - <reference ref="677519740"/> - <reference ref="238351151"/> - </object> - <reference key="parent" ref="767671776"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">416</int> - <reference key="object" ref="252969304"/> - <reference key="parent" ref="175441468"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">417</int> - <reference key="object" ref="766922938"/> - <reference key="parent" ref="175441468"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">418</int> - <reference key="object" ref="677519740"/> - <reference key="parent" ref="175441468"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">419</int> - <reference key="object" ref="238351151"/> - <reference key="parent" ref="175441468"/> - </object> - <object class="IBObjectRecord"> <int key="objectID">420</int> <reference key="object" ref="755631768"/> <reference key="parent" ref="0"/> @@ -3029,149 +2140,6 @@ <reference key="parent" ref="0"/> </object> <object class="IBObjectRecord"> - <int key="objectID">496</int> - <reference key="object" ref="215659978"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="446991534"/> - </object> - <reference key="parent" ref="941447902"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">497</int> - <reference key="object" ref="446991534"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="875092757"/> - <reference ref="630155264"/> - <reference ref="945678886"/> - <reference ref="512868991"/> - <reference ref="163117631"/> - <reference ref="31516759"/> - <reference ref="908105787"/> - <reference ref="644046920"/> - <reference ref="231811626"/> - <reference ref="883618387"/> - </object> - <reference key="parent" ref="215659978"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">498</int> - <reference key="object" ref="875092757"/> - <reference key="parent" ref="446991534"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">499</int> - <reference key="object" ref="630155264"/> - <reference key="parent" ref="446991534"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">500</int> - <reference key="object" ref="945678886"/> - <reference key="parent" ref="446991534"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">501</int> - <reference key="object" ref="512868991"/> - <reference key="parent" ref="446991534"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">502</int> - <reference key="object" ref="163117631"/> - <reference key="parent" ref="446991534"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">503</int> - <reference key="object" ref="31516759"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="956096989"/> - </object> - <reference key="parent" ref="446991534"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">504</int> - <reference key="object" ref="908105787"/> - <reference key="parent" ref="446991534"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">505</int> - <reference key="object" ref="644046920"/> - <reference key="parent" ref="446991534"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">506</int> - <reference key="object" ref="231811626"/> - <reference key="parent" ref="446991534"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">507</int> - <reference key="object" ref="883618387"/> - <reference key="parent" ref="446991534"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">508</int> - <reference key="object" ref="956096989"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="257099033"/> - <reference ref="551969625"/> - <reference ref="249532473"/> - <reference ref="607364498"/> - <reference ref="508151438"/> - <reference ref="981751889"/> - <reference ref="380031999"/> - <reference ref="825984362"/> - <reference ref="560145579"/> - </object> - <reference key="parent" ref="31516759"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">509</int> - <reference key="object" ref="257099033"/> - <reference key="parent" ref="956096989"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">510</int> - <reference key="object" ref="551969625"/> - <reference key="parent" ref="956096989"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">511</int> - <reference key="object" ref="249532473"/> - <reference key="parent" ref="956096989"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">512</int> - <reference key="object" ref="607364498"/> - <reference key="parent" ref="956096989"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">513</int> - <reference key="object" ref="508151438"/> - <reference key="parent" ref="956096989"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">514</int> - <reference key="object" ref="981751889"/> - <reference key="parent" ref="956096989"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">515</int> - <reference key="object" ref="380031999"/> - <reference key="parent" ref="956096989"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">516</int> - <reference key="object" ref="825984362"/> - <reference key="parent" ref="956096989"/> - </object> - <object class="IBObjectRecord"> - <int key="objectID">517</int> - <reference key="object" ref="560145579"/> - <reference key="parent" ref="956096989"/> - </object> - <object class="IBObjectRecord"> <int key="objectID">534</int> <reference key="object" ref="816668511"/> <object class="NSMutableArray" key="children"> @@ -3192,6 +2160,8 @@ <reference ref="1027125810"/> <reference ref="864702084"/> <reference ref="208343368"/> + <reference ref="377902755"/> + <reference ref="191469404"/> </object> <reference key="parent" ref="816668511"/> </object> @@ -3257,6 +2227,41 @@ <reference key="object" ref="864702084"/> <reference key="parent" ref="865232259"/> </object> + <object class="IBObjectRecord"> + <int key="objectID">555</int> + <reference key="object" ref="694544109"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">556</int> + <reference key="object" ref="1025359947"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">557</int> + <reference key="object" ref="943694335"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">558</int> + <reference key="object" ref="863984465"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">562</int> + <reference key="object" ref="138443116"/> + <reference key="parent" ref="466310130"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">565</int> + <reference key="object" ref="377902755"/> + <reference key="parent" ref="865232259"/> + </object> + <object class="IBObjectRecord"> + <int key="objectID">566</int> + <reference key="object" ref="191469404"/> + <reference key="parent" ref="865232259"/> + </object> </object> </object> <object class="NSMutableDictionary" key="flattenedProperties"> @@ -3392,43 +2397,6 @@ <string>351.ImportedFromIB2</string> <string>354.IBPluginDependency</string> <string>354.ImportedFromIB2</string> - <string>375.IBPluginDependency</string> - <string>376.IBEditorWindowLastContentRect</string> - <string>376.IBPluginDependency</string> - <string>377.IBPluginDependency</string> - <string>388.IBEditorWindowLastContentRect</string> - <string>388.IBPluginDependency</string> - <string>389.IBPluginDependency</string> - <string>390.IBPluginDependency</string> - <string>391.IBPluginDependency</string> - <string>392.IBPluginDependency</string> - <string>393.IBPluginDependency</string> - <string>394.IBPluginDependency</string> - <string>395.IBPluginDependency</string> - <string>396.IBPluginDependency</string> - <string>397.IBPluginDependency</string> - <string>398.IBPluginDependency</string> - <string>399.IBPluginDependency</string> - <string>400.IBPluginDependency</string> - <string>401.IBPluginDependency</string> - <string>402.IBPluginDependency</string> - <string>403.IBPluginDependency</string> - <string>404.IBPluginDependency</string> - <string>405.IBPluginDependency</string> - <string>406.IBPluginDependency</string> - <string>407.IBPluginDependency</string> - <string>408.IBPluginDependency</string> - <string>409.IBPluginDependency</string> - <string>410.IBPluginDependency</string> - <string>411.IBPluginDependency</string> - <string>412.IBPluginDependency</string> - <string>413.IBPluginDependency</string> - <string>414.IBPluginDependency</string> - <string>415.IBPluginDependency</string> - <string>416.IBPluginDependency</string> - <string>417.IBPluginDependency</string> - <string>418.IBPluginDependency</string> - <string>419.IBPluginDependency</string> <string>450.IBPluginDependency</string> <string>451.IBEditorWindowLastContentRect</string> <string>451.IBPluginDependency</string> @@ -3446,32 +2414,8 @@ <string>491.IBEditorWindowLastContentRect</string> <string>491.IBPluginDependency</string> <string>492.IBPluginDependency</string> - <string>496.IBPluginDependency</string> - <string>497.IBEditorWindowLastContentRect</string> - <string>497.IBPluginDependency</string> - <string>498.IBPluginDependency</string> - <string>499.IBPluginDependency</string> <string>5.IBPluginDependency</string> <string>5.ImportedFromIB2</string> - <string>500.IBPluginDependency</string> - <string>501.IBPluginDependency</string> - <string>502.IBPluginDependency</string> - <string>503.IBPluginDependency</string> - <string>504.IBPluginDependency</string> - <string>505.IBPluginDependency</string> - <string>506.IBPluginDependency</string> - <string>507.IBPluginDependency</string> - <string>508.IBEditorWindowLastContentRect</string> - <string>508.IBPluginDependency</string> - <string>509.IBPluginDependency</string> - <string>510.IBPluginDependency</string> - <string>511.IBPluginDependency</string> - <string>512.IBPluginDependency</string> - <string>513.IBPluginDependency</string> - <string>514.IBPluginDependency</string> - <string>515.IBPluginDependency</string> - <string>516.IBPluginDependency</string> - <string>517.IBPluginDependency</string> <string>534.IBPluginDependency</string> <string>535.IBEditorWindowLastContentRect</string> <string>535.IBPluginDependency</string> @@ -3486,8 +2430,15 @@ <string>550.IBPluginDependency</string> <string>552.IBPluginDependency</string> <string>553.IBPluginDependency</string> + <string>555.IBPluginDependency</string> + <string>556.IBPluginDependency</string> + <string>557.IBPluginDependency</string> + <string>558.IBPluginDependency</string> <string>56.IBPluginDependency</string> <string>56.ImportedFromIB2</string> + <string>562.IBPluginDependency</string> + <string>565.IBPluginDependency</string> + <string>566.IBPluginDependency</string> <string>57.IBEditorWindowLastContentRect</string> <string>57.IBPluginDependency</string> <string>57.ImportedFromIB2</string> @@ -3578,7 +2529,7 @@ <integer value="1"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <integer value="1"/> - <string>{{546, 553}, {254, 283}}</string> + <string>{{650, 538}, {254, 283}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <integer value="1"/> <string>{{187, 434}, {243, 243}}</string> @@ -3623,17 +2574,17 @@ <integer value="1"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <integer value="1"/> - <string>{{639, 872}, {194, 73}}</string> + <string>{{744, 748}, {194, 73}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <integer value="1"/> <string>{{525, 802}, {197, 73}}</string> - <string>{{317, 836}, {517, 20}}</string> + <string>{{488, 821}, {451, 20}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <integer value="1"/> <string>{74, 862}</string> <string>{{6, 978}, {478, 20}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{656, 793}, {231, 43}}</string> + <string>{{694, 688}, {234, 133}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>{{475, 832}, {234, 43}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -3653,43 +2604,6 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <integer value="1"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{527, 902}, {83, 43}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{523, 2}, {178, 283}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>{{753, 197}, {170, 63}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -3703,29 +2617,16 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{714, 922}, {193, 23}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{674, 260}, {204, 183}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{881, 798}, {189, 23}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <integer value="1"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{864, 668}, {260, 153}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{878, 180}, {164, 173}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <string>{{1110, 678}, {154, 43}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -3733,10 +2634,6 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{759, 713}, {246, 123}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{944, 872}, {154, 43}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -3744,10 +2641,10 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> + <integer value="1"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="1"/> <string>{{286, 129}, {275, 183}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <integer value="1"/> @@ -3770,7 +2667,7 @@ <integer value="1"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <integer value="1"/> - <string>{{504, 633}, {196, 203}}</string> + <string>{{608, 618}, {196, 203}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <integer value="1"/> <string>{{145, 474}, {199, 203}}</string> @@ -3798,7 +2695,7 @@ </object> </object> <nil key="sourceID"/> - <int key="maxID">554</int> + <int key="maxID">567</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <object class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -3821,6 +2718,30 @@ <string>id</string> </object> </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>setSharedProcessProcessModel:</string> + <string>setSharedThreadProcessModel:</string> + <string>showStatisticsWindow:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBActionInfo"> + <string key="name">setSharedProcessProcessModel:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">setSharedThreadProcessModel:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">showStatisticsWindow:</string> + <string key="candidateClassName">id</string> + </object> + </object> + </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBProjectSource</string> <string key="minorKey">mac/AppDelegate.h</string> @@ -3833,6 +2754,13 @@ <string key="NS.key.0">window</string> <string key="NS.object.0">NSWindow</string> </object> + <object class="NSMutableDictionary" key="toOneOutletInfosByName"> + <string key="NS.key.0">window</string> + <object class="IBToOneOutletInfo" key="NS.object.0"> + <string key="name">window</string> + <string key="candidateClassName">NSWindow</string> + </object> + </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBUserSource</string> <string key="minorKey"/> @@ -3845,11 +2773,18 @@ <bool key="EncodedWithXMLCoder">YES</bool> <object class="NSArray" key="dict.sortedKeys"> <bool key="EncodedWithXMLCoder">YES</bool> + <string>dumpSourceToConsole:</string> <string>fetch:</string> <string>forceRepaint:</string> + <string>goBack:</string> + <string>goForward:</string> <string>reload:</string> <string>removeReinsertWebView:</string> + <string>resetZoom:</string> <string>showHideWebView:</string> + <string>toggleZoomMode:</string> + <string>zoomIn:</string> + <string>zoomOut:</string> </object> <object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -3858,25 +2793,151 @@ <string>id</string> <string>id</string> <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + <string>id</string> + </object> + </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>dumpSourceToConsole:</string> + <string>fetch:</string> + <string>forceRepaint:</string> + <string>goBack:</string> + <string>goForward:</string> + <string>reload:</string> + <string>removeReinsertWebView:</string> + <string>resetZoom:</string> + <string>showHideWebView:</string> + <string>toggleZoomMode:</string> + <string>zoomIn:</string> + <string>zoomOut:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBActionInfo"> + <string key="name">dumpSourceToConsole:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">fetch:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">forceRepaint:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">goBack:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">goForward:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">reload:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">removeReinsertWebView:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">resetZoom:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">showHideWebView:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">toggleZoomMode:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">zoomIn:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">zoomOut:</string> + <string key="candidateClassName">id</string> + </object> </object> </object> <object class="NSMutableDictionary" key="outlets"> <bool key="EncodedWithXMLCoder">YES</bool> <object class="NSArray" key="dict.sortedKeys"> <bool key="EncodedWithXMLCoder">YES</bool> + <string>backButton</string> <string>containerView</string> + <string>forwardButton</string> <string>progressIndicator</string> <string>reloadButton</string> + <string>toolbar</string> <string>urlText</string> </object> <object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> + <string>NSButton</string> <string>NSView</string> + <string>NSButton</string> <string>NSProgressIndicator</string> <string>NSButton</string> + <string>NSToolbar</string> <string>NSTextField</string> </object> </object> + <object class="NSMutableDictionary" key="toOneOutletInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>backButton</string> + <string>containerView</string> + <string>forwardButton</string> + <string>progressIndicator</string> + <string>reloadButton</string> + <string>toolbar</string> + <string>urlText</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBToOneOutletInfo"> + <string key="name">backButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">containerView</string> + <string key="candidateClassName">NSView</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">forwardButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">progressIndicator</string> + <string key="candidateClassName">NSProgressIndicator</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">reloadButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">toolbar</string> + <string key="candidateClassName">NSToolbar</string> + </object> + <object class="IBToOneOutletInfo"> + <string key="name">urlText</string> + <string key="candidateClassName">NSTextField</string> + </object> + </object> + </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBProjectSource</string> <string key="minorKey">mac/BrowserWindowController.h</string> @@ -3898,6 +2959,25 @@ <string>id</string> </object> </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>forceRepaint:</string> + <string>newWindow:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBActionInfo"> + <string key="name">forceRepaint:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">newWindow:</string> + <string key="candidateClassName">id</string> + </object> + </object> + </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBUserSource</string> <string key="minorKey"/> @@ -3997,6 +3077,45 @@ <string>id</string> </object> </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>printDocument:</string> + <string>revertDocumentToSaved:</string> + <string>runPageLayout:</string> + <string>saveDocument:</string> + <string>saveDocumentAs:</string> + <string>saveDocumentTo:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBActionInfo"> + <string key="name">printDocument:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">revertDocumentToSaved:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">runPageLayout:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">saveDocument:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">saveDocumentAs:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">saveDocumentTo:</string> + <string key="candidateClassName">id</string> + </object> + </object> + </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBFrameworkSource</string> <string key="minorKey">AppKit.framework/Headers/NSDocument.h</string> @@ -4029,6 +3148,35 @@ <string>id</string> </object> </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>clearRecentDocuments:</string> + <string>newDocument:</string> + <string>openDocument:</string> + <string>saveAllDocuments:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="IBActionInfo"> + <string key="name">clearRecentDocuments:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">newDocument:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">openDocument:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo"> + <string key="name">saveAllDocuments:</string> + <string key="candidateClassName">id</string> + </object> + </object> + </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBFrameworkSource</string> <string key="minorKey">AppKit.framework/Headers/NSDocumentController.h</string> @@ -4376,6 +3524,14 @@ </object> </object> <object class="IBPartialClassDescription"> + <string key="className">NSToolbar</string> + <string key="superclassName">NSObject</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier"> + <string key="majorKey">IBFrameworkSource</string> + <string key="minorKey">AppKit.framework/Headers/NSToolbar.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> <string key="className">NSView</string> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBFrameworkSource</string> @@ -4427,6 +3583,13 @@ <string key="NS.key.0">showWindow:</string> <string key="NS.object.0">id</string> </object> + <object class="NSMutableDictionary" key="actionInfosByName"> + <string key="NS.key.0">showWindow:</string> + <object class="IBActionInfo" key="NS.object.0"> + <string key="name">showWindow:</string> + <string key="candidateClassName">id</string> + </object> + </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBFrameworkSource</string> <string key="minorKey">AppKit.framework/Headers/NSWindowController.h</string> @@ -4436,16 +3599,12 @@ </object> <int key="IBDocument.localizationMode">0</int> <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> - <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults"> - <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> - <integer value="1060" key="NS.object.0"/> - </object> <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> <integer value="3000" key="NS.object.0"/> </object> <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> - <string key="IBDocument.LastKnownRelativeProjectPath">../../MiniBrowser.xcodeproj</string> + <string key="IBDocument.LastKnownRelativeProjectPath">../MiniBrowser.xcodeproj</string> <int key="IBDocument.defaultPropertyAccessControl">3</int> <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> <bool key="EncodedWithXMLCoder">YES</bool> diff --git a/WebKitTools/MiniBrowser/qt/BrowserView.cpp b/WebKitTools/MiniBrowser/qt/BrowserView.cpp index a5e06ec..ce101c2 100644 --- a/WebKitTools/MiniBrowser/qt/BrowserView.cpp +++ b/WebKitTools/MiniBrowser/qt/BrowserView.cpp @@ -39,9 +39,8 @@ static QWKPage* createNewPage(QWKPage* page) BrowserView::BrowserView(QWidget* parent) : QGraphicsView(parent) , m_item(0) + , m_context(WKContextGetSharedProcessContext()) { - m_context.adopt(WKContextGetSharedProcessContext()); - WKRetainPtr<WKPageNamespaceRef> pageNamespace(AdoptWK, WKPageNamespaceCreate(m_context.get())); m_item = new QGraphicsWKView(pageNamespace.get(), QGraphicsWKView::Simple, 0); diff --git a/WebKitTools/MiniBrowser/win/BrowserView.cpp b/WebKitTools/MiniBrowser/win/BrowserView.cpp index d3d5e72..5e90fe2 100644 --- a/WebKitTools/MiniBrowser/win/BrowserView.cpp +++ b/WebKitTools/MiniBrowser/win/BrowserView.cpp @@ -60,6 +60,23 @@ static void runJavaScriptAlert(WKPageRef page, WKStringRef alertText, WKFrameRef { } +static bool runJavaScriptConfirm(WKPageRef page, WKStringRef message, WKFrameRef frame, const void* clientInfo) +{ + return false; +} + +static WKStringRef runJavaScriptPrompt(WKPageRef page, WKStringRef message, WKStringRef defaultValue, WKFrameRef frame, const void* clientInfo) +{ + return 0; +} + +static void setStatusText(WKPageRef page, WKStringRef text, const void* clientInfo) +{ +} + +static void contentsSizeChanged(WKPageRef page, int width, int height, WKFrameRef frame, const void *clientInfo) +{ +} void BrowserView::create(RECT webViewRect, BrowserWindow* parentWindow) { @@ -84,8 +101,12 @@ void BrowserView::create(RECT webViewRect, BrowserWindow* parentWindow) showPage, closePage, runJavaScriptAlert, - 0 /* contentsSizeChanged */ + runJavaScriptConfirm, + runJavaScriptPrompt, + setStatusText, + contentsSizeChanged }; + WKPageSetPageUIClient(WKViewGetPage(m_webView), &uiClient); } diff --git a/WebKitTools/QtTestBrowser/launcherwindow.cpp b/WebKitTools/QtTestBrowser/launcherwindow.cpp index 3b47f29..65bcee7 100644 --- a/WebKitTools/QtTestBrowser/launcherwindow.cpp +++ b/WebKitTools/QtTestBrowser/launcherwindow.cpp @@ -105,6 +105,9 @@ void LauncherWindow::initializeView() { delete m_view; + QUrl url = page()->mainFrame()->url(); + setPage(new WebPage(this)); + QSplitter* splitter = static_cast<QSplitter*>(centralWidget()); if (!m_windowOptions.useGraphicsView) { @@ -128,6 +131,9 @@ void LauncherWindow::initializeView() m_view = view; } + if (url.isValid()) + page()->mainFrame()->load(url); + #if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) m_touchMocking = false; #endif @@ -606,16 +612,20 @@ void LauncherWindow::print() void LauncherWindow::screenshot() { QPixmap pixmap = QPixmap::grabWidget(m_view); - QLabel* label = new QLabel; + QLabel* label = 0; +#if !defined(Q_OS_SYMBIAN) + label = new QLabel; label->setAttribute(Qt::WA_DeleteOnClose); label->setWindowTitle("Screenshot - Preview"); label->setPixmap(pixmap); label->show(); +#endif QString fileName = QFileDialog::getSaveFileName(label, "Screenshot"); if (!fileName.isEmpty()) { pixmap.save(fileName, "png"); - label->setWindowTitle(QString("Screenshot - Saved at %1").arg(fileName)); + if (label) + label->setWindowTitle(QString("Screenshot - Saved at %1").arg(fileName)); } #if defined(QT_CONFIGURED_WITH_OPENGL) diff --git a/WebKitTools/QtTestBrowser/launcherwindow.h b/WebKitTools/QtTestBrowser/launcherwindow.h index 65f390d..d3b7f8e 100644 --- a/WebKitTools/QtTestBrowser/launcherwindow.h +++ b/WebKitTools/QtTestBrowser/launcherwindow.h @@ -148,8 +148,6 @@ protected slots: /* void dumpPlugins() */ void dumpHtml(); - void initializeView(); - void setTouchMocking(bool on); void toggleWebView(bool graphicsBased); void toggleAcceleratedCompositing(bool toggle); @@ -183,11 +181,13 @@ signals: private: void init(); - bool isGraphicsBased() const; + void initializeView(); void createChrome(); void applyPrefs(); void applyZoom(); + bool isGraphicsBased() const; + private: static QVector<int> m_zoomLevels; int m_currentZoom; diff --git a/WebKitTools/QtTestBrowser/mainwindow.cpp b/WebKitTools/QtTestBrowser/mainwindow.cpp index 1a9aa5f..fa8b87d 100644 --- a/WebKitTools/QtTestBrowser/mainwindow.cpp +++ b/WebKitTools/QtTestBrowser/mainwindow.cpp @@ -35,8 +35,9 @@ #include "locationedit.h" #include "utils.h" -MainWindow::MainWindow(const QString& url) +MainWindow::MainWindow() : m_page(new WebPage(this)) + , m_toolBar(0) { setAttribute(Qt::WA_DeleteOnClose); if (qgetenv("QTTESTBROWSER_USE_ARGB_VISUALS").toInt() == 1) @@ -47,29 +48,31 @@ MainWindow::MainWindow(const QString& url) void MainWindow::buildUI() { - QToolBar* bar = addToolBar("Navigation"); + delete m_toolBar; + + m_toolBar = addToolBar("Navigation"); #if defined(Q_OS_SYMBIAN) - bar->setIconSize(QSize(16, 16)); + m_toolBar->setIconSize(QSize(16, 16)); #endif QAction* reloadAction = page()->action(QWebPage::Reload); connect(reloadAction, SIGNAL(triggered()), this, SLOT(changeLocation())); - bar->addAction(page()->action(QWebPage::Back)); - bar->addAction(page()->action(QWebPage::Forward)); - bar->addAction(reloadAction); - bar->addAction(page()->action(QWebPage::Stop)); + m_toolBar->addAction(page()->action(QWebPage::Back)); + m_toolBar->addAction(page()->action(QWebPage::Forward)); + m_toolBar->addAction(reloadAction); + m_toolBar->addAction(page()->action(QWebPage::Stop)); - urlEdit = new LocationEdit(this); + urlEdit = new LocationEdit(m_toolBar); urlEdit->setSizePolicy(QSizePolicy::Expanding, urlEdit->sizePolicy().verticalPolicy()); connect(urlEdit, SIGNAL(returnPressed()), SLOT(changeLocation())); - QCompleter* completer = new QCompleter(this); + QCompleter* completer = new QCompleter(m_toolBar); urlEdit->setCompleter(completer); completer->setModel(&urlModel); #if defined(Q_OS_SYMBIAN) addToolBarBreak(); addToolBar("Location")->addWidget(urlEdit); #else - bar->addWidget(urlEdit); + m_toolBar->addWidget(urlEdit); #endif connect(page()->mainFrame(), SIGNAL(titleChanged(const QString&)), @@ -94,7 +97,15 @@ void MainWindow::buildUI() page()->action(QWebPage::ToggleUnderline)->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_U)); } -WebPage* MainWindow::page() +void MainWindow::setPage(WebPage* page) +{ + delete m_page; + m_page = page; + + buildUI(); +} + +WebPage* MainWindow::page() const { return m_page; } diff --git a/WebKitTools/QtTestBrowser/mainwindow.h b/WebKitTools/QtTestBrowser/mainwindow.h index 6fbf9f4..3a39d57 100644 --- a/WebKitTools/QtTestBrowser/mainwindow.h +++ b/WebKitTools/QtTestBrowser/mainwindow.h @@ -42,14 +42,15 @@ class MainWindow : public QMainWindow { Q_OBJECT public: - MainWindow(const QString& url = QString()); + MainWindow(); void addCompleterEntry(const QUrl& url); void load(const QString& url); void load(const QUrl& url); - WebPage* page(); + WebPage* page() const; + void setPage(WebPage*); protected slots: void setAddressUrl(const QString& url); @@ -61,11 +62,11 @@ protected slots: private: void buildUI(); + WebPage* m_page; + QToolBar* m_toolBar; QStringListModel urlModel; QStringList urlList; LocationEdit* urlEdit; - - WebPage* m_page; }; #endif diff --git a/WebKitTools/QtTestBrowser/webview.cpp b/WebKitTools/QtTestBrowser/webview.cpp index bc8fad1..d8d89a9 100644 --- a/WebKitTools/QtTestBrowser/webview.cpp +++ b/WebKitTools/QtTestBrowser/webview.cpp @@ -59,7 +59,7 @@ WebViewGraphicsBased::WebViewGraphicsBased(QWidget* parent) void WebViewGraphicsBased::setPage(QWebPage* page) { connect(page->mainFrame(), SIGNAL(contentsSizeChanged(const QSize&)), SLOT(contentsSizeChanged(const QSize&))); - m_item->setPage(page); + graphicsWebView()->setPage(page); } void WebViewGraphicsBased::contentsSizeChanged(const QSize& size) @@ -74,7 +74,7 @@ void WebViewGraphicsBased::setResizesToContents(bool b) return; m_resizesToContents = b; - m_item->setResizesToContents(m_resizesToContents); + graphicsWebView()->setResizesToContents(m_resizesToContents); // When setting resizesToContents ON, our web view widget will always size as big as the // web content being displayed, and so will the QWebPage's viewport. It implies that internally @@ -94,16 +94,16 @@ void WebViewGraphicsBased::setResizesToContents(bool b) if (m_resizesToContents) { setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - m_item->page()->setPreferredContentsSize(size()); - QRectF itemRect(m_item->geometry().topLeft(), m_item->page()->mainFrame()->contentsSize()); - m_item->setGeometry(itemRect); + graphicsWebView()->page()->setPreferredContentsSize(size()); + QRectF itemRect(graphicsWebView()->geometry().topLeft(), graphicsWebView()->page()->mainFrame()->contentsSize()); + graphicsWebView()->setGeometry(itemRect); scene()->setSceneRect(itemRect); } else { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_item->page()->setPreferredContentsSize(QSize()); + graphicsWebView()->page()->setPreferredContentsSize(QSize()); QRect viewportRect(QPoint(0, 0), size()); - m_item->setGeometry(viewportRect); + graphicsWebView()->setGeometry(viewportRect); scene()->setSceneRect(viewportRect); } } @@ -115,12 +115,12 @@ void WebViewGraphicsBased::resizeEvent(QResizeEvent* event) QSize size(event->size()); if (m_resizesToContents) { - m_item->page()->setPreferredContentsSize(size); + graphicsWebView()->page()->setPreferredContentsSize(size); return; } QRectF rect(QPoint(0, 0), size); - m_item->setGeometry(rect); + graphicsWebView()->setGeometry(rect); scene()->setSceneRect(rect); } @@ -152,14 +152,14 @@ void WebViewGraphicsBased::updateFrameRate() void WebViewGraphicsBased::animatedFlip() { #if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - QSizeF center = m_item->boundingRect().size() / 2; + QSizeF center = graphicsWebView()->boundingRect().size() / 2; QPointF centerPoint = QPointF(center.width(), center.height()); - m_item->setTransformOriginPoint(centerPoint); + graphicsWebView()->setTransformOriginPoint(centerPoint); - QPropertyAnimation* animation = new QPropertyAnimation(m_item, "rotation", this); + QPropertyAnimation* animation = new QPropertyAnimation(graphicsWebView(), "rotation", this); animation->setDuration(1000); - int rotation = int(m_item->rotation()); + int rotation = int(graphicsWebView()->rotation()); animation->setStartValue(rotation); animation->setEndValue(rotation + 180 - (rotation % 180)); diff --git a/WebKitTools/QtTestBrowser/webview.h b/WebKitTools/QtTestBrowser/webview.h index d0e1e57..aadf85c 100644 --- a/WebKitTools/QtTestBrowser/webview.h +++ b/WebKitTools/QtTestBrowser/webview.h @@ -75,8 +75,8 @@ public: WebViewGraphicsBased(QWidget* parent); void setPage(QWebPage* page); - void setItemCacheMode(QGraphicsItem::CacheMode mode) { m_item->setCacheMode(mode); } - QGraphicsItem::CacheMode itemCacheMode() { return m_item->cacheMode(); } + void setItemCacheMode(QGraphicsItem::CacheMode mode) { graphicsWebView()->setCacheMode(mode); } + QGraphicsItem::CacheMode itemCacheMode() { return graphicsWebView()->cacheMode(); } void setFrameRateMeasurementEnabled(bool enabled); bool frameRateMeasurementEnabled() const { return m_measureFps; } @@ -87,21 +87,8 @@ public: void setResizesToContents(bool b); bool resizesToContents() const { return m_resizesToContents; } - void setYRotation(qreal angle) - { -#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) - QRectF r = m_item->boundingRect(); - m_item->setTransform(QTransform() - .translate(r.width() / 2, r.height() / 2) - .rotate(angle, Qt::YAxis) - .translate(-r.width() / 2, -r.height() / 2)); -#endif - m_yRotation = angle; - } - qreal yRotation() const - { - return m_yRotation; - } + void setYRotation(qreal angle); + qreal yRotation() const { return m_yRotation; } GraphicsWebView* graphicsWebView() const { return m_item; } @@ -128,4 +115,16 @@ private: FpsTimer m_fpsTimer; }; +inline void WebViewGraphicsBased::setYRotation(qreal angle) +{ +#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0) + QRectF r = graphicsWebView()->boundingRect(); + graphicsWebView()->setTransform(QTransform() + .translate(r.width() / 2, r.height() / 2) + .rotate(angle, Qt::YAxis) + .translate(-r.width() / 2, -r.height() / 2)); +#endif + m_yRotation = angle; +} + #endif diff --git a/WebKitTools/QueueStatusServer/app.yaml b/WebKitTools/QueueStatusServer/app.yaml index f6ff870..76d8963 100644 --- a/WebKitTools/QueueStatusServer/app.yaml +++ b/WebKitTools/QueueStatusServer/app.yaml @@ -7,5 +7,9 @@ handlers: - url: /stylesheets static_dir: stylesheets +- url: /remote_api + script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py + login: admin + - url: /.* script: main.py diff --git a/WebKitTools/QueueStatusServer/handlers/nextpatch.py b/WebKitTools/QueueStatusServer/handlers/nextpatch.py new file mode 100644 index 0000000..edb702a --- /dev/null +++ b/WebKitTools/QueueStatusServer/handlers/nextpatch.py @@ -0,0 +1,61 @@ +# 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. + +from google.appengine.ext import db +from google.appengine.ext import webapp + +from model.workitems import WorkItems +from model.activeworkitems import ActiveWorkItems +from model import queuestatus + +from datetime import datetime, timedelta + + +class NextPatch(webapp.RequestHandler): + def _get_next_patch_id(self, queue_name): + work_items = WorkItems.all().filter("queue_name =", queue_name).get() + if not work_items: + return None + active_work_items = ActiveWorkItems.get_or_insert(key_name=queue_name, queue_name=queue_name) + return db.run_in_transaction(self._assign_patch, active_work_items.key(), work_items.item_ids) + + def get(self, queue_name): + patch_id = self._get_next_patch_id(queue_name) + if not patch_id: + self.error(404) + return + self.response.out.write(patch_id) + + @staticmethod + def _assign_patch(key, work_item_ids): + now = datetime.now() + active_work_items = db.get(key) + active_work_items.deactivate_expired(now) + next_item = active_work_items.next_item(work_item_ids, now) + active_work_items.put() + return next_item diff --git a/WebKitTools/QueueStatusServer/handlers/queuestatus.py b/WebKitTools/QueueStatusServer/handlers/queuestatus.py index 5295b17..f76157d 100644 --- a/WebKitTools/QueueStatusServer/handlers/queuestatus.py +++ b/WebKitTools/QueueStatusServer/handlers/queuestatus.py @@ -50,9 +50,24 @@ class QueueStatus(webapp.RequestHandler): def get(self, queue_name): work_items = WorkItems.all().filter("queue_name =", queue_name).get() statuses = queuestatus.QueueStatus.all().filter("queue_name =", queue_name).order("-date").fetch(15) + + status_groups = [] + last_patch_id = None + synthetic_patch_id_counter = 0 + + for status in statuses: + patch_id = status.active_patch_id + if not patch_id or last_patch_id != patch_id: + status_group = [] + status_groups.append(status_group) + else: + status_group = status_groups[-1] + status_group.append(status) + last_patch_id = patch_id + template_values = { "display_queue_name": display_name_for_queue(queue_name), "work_item_rows": self._rows_for_work_items(work_items), - "statuses": statuses, + "status_groups": status_groups, } self.response.out.write(template.render("templates/queuestatus.html", template_values)) diff --git a/WebKitTools/QueueStatusServer/index.yaml b/WebKitTools/QueueStatusServer/index.yaml index 94b6692..6c9a3b2 100644 --- a/WebKitTools/QueueStatusServer/index.yaml +++ b/WebKitTools/QueueStatusServer/index.yaml @@ -27,6 +27,11 @@ indexes: properties: - name: queue_name - name: date + +- kind: QueueStatus + properties: + - name: queue_name + - name: date direction: desc - kind: SVNRevision diff --git a/WebKitTools/QueueStatusServer/main.py b/WebKitTools/QueueStatusServer/main.py index e550dc5..93227ca 100644 --- a/WebKitTools/QueueStatusServer/main.py +++ b/WebKitTools/QueueStatusServer/main.py @@ -35,6 +35,7 @@ from google.appengine.ext.webapp.util import run_wsgi_app from handlers.dashboard import Dashboard from handlers.gc import GC +from handlers.nextpatch import NextPatch from handlers.patch import Patch from handlers.patchstatus import PatchStatus from handlers.queuestatus import QueueStatus @@ -59,6 +60,7 @@ routes = [ (r'/status-bubble/(.*)', StatusBubble), (r'/svn-revision/(.*)', SVNRevision), (r'/queue-status/(.*)', QueueStatus), + (r'/next-patch/(.*)', NextPatch), ('/update-status', UpdateStatus), ('/update-work-items', UpdateWorkItems), ('/update-svn-revision', UpdateSVNRevision), diff --git a/WebKitTools/QueueStatusServer/model/activeworkitems.py b/WebKitTools/QueueStatusServer/model/activeworkitems.py new file mode 100644 index 0000000..e24e6ca --- /dev/null +++ b/WebKitTools/QueueStatusServer/model/activeworkitems.py @@ -0,0 +1,58 @@ +# 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. + +from google.appengine.ext import db + +from datetime import timedelta +import time + + +class ActiveWorkItems(db.Model): + queue_name = db.StringProperty() + item_ids = db.ListProperty(int) + item_dates = db.ListProperty(float) + date = db.DateTimeProperty(auto_now_add=True) + + def deactivate_expired(self, now): + one_hour_ago = time.mktime((now - timedelta(minutes=60)).timetuple()) + nonexpired_item_ids = [] + nonexpired_item_dates = [] + for i in range(len(self.item_ids)): + if self.item_dates[i] > one_hour_ago: + nonexpired_item_ids.append(self.item_ids[i]) + nonexpired_item_dates.append(self.item_dates[i]) + self.item_ids = nonexpired_item_ids + self.item_dates = nonexpired_item_dates + + def next_item(self, work_item_ids, now): + for item_id in work_item_ids: + if item_id not in self.item_ids: + self.item_ids.append(item_id) + self.item_dates.append(time.mktime(now.timetuple())) + return item_id + return None diff --git a/WebKitTools/QueueStatusServer/stylesheets/dashboard.css b/WebKitTools/QueueStatusServer/stylesheets/dashboard.css index 1ecf2eb..7b4f857 100644 --- a/WebKitTools/QueueStatusServer/stylesheets/dashboard.css +++ b/WebKitTools/QueueStatusServer/stylesheets/dashboard.css @@ -44,36 +44,59 @@ td { tr:hover, li:hover { background-color: #EEE; } + +.status-group { + font-size: 90%; +} + +.status-bug { + font-weight: bold; +} + +.status-group ul { + font-size: 90%; +} + +.status-group ul li { + padding: 2px 0 2px 7px; + overflow: hidden; +} + +.status-group ul li:hover { + background: #ddd; +} + .status-date { color: #AAA; float: right; font-size: 8pt; } -.status { + +.status-cell { margin: 1px; padding: 1px 2px; font-size: 9pt; border: 1px solid transparent; } -.status:hover { +.status-cell:hover { border: 1px solid black; } -.pass { +.status-cell.pass { background-color: #8FDF5F; cursor: pointer; /* border: 1px solid #4F8530; */ } -.fail { +.status-cell.fail { background-color: #E98080; cursor: pointer; /* border: 1px solid #A77272; */ } -.pending { +.status-cell.pending { background-color: #FFFC6C; cursor: pointer; /* border: 1px solid #C5C56D; */ } -.error { +.status-cell.error { background-color: #E0B0FF; cursor: pointer; /* border: 1px solid #ACA0B3; */ diff --git a/WebKitTools/QueueStatusServer/templates/dashboard.html b/WebKitTools/QueueStatusServer/templates/dashboard.html index c5c2359..f88a5ea 100644 --- a/WebKitTools/QueueStatusServer/templates/dashboard.html +++ b/WebKitTools/QueueStatusServer/templates/dashboard.html @@ -24,14 +24,14 @@ function statusDetail(patch_id) { </thead> <tbody>{% for row in rows %} <tr> - <td class="status"> + <td class="status-cell"> {{ row.bug_id|force_escape|webkit_bug_id|safe }} </td> - <td class="status"> + <td class="status-cell"> {{ row.attachment_id|force_escape|webkit_attachment_id|safe }} </td> {% for bubble in row.bubbles %} - <td class="status {{ bubble.status_class }}" + <td class="status-cell {{ bubble.status_class }}" {% if bubble.status %} onclick="statusDetail({{ row.attachment_id }})" title="{{ bubble.status_date|timesince }}" diff --git a/WebKitTools/QueueStatusServer/templates/includes/singlequeuestatus.html b/WebKitTools/QueueStatusServer/templates/includes/singlequeuestatus.html new file mode 100644 index 0000000..075cd39 --- /dev/null +++ b/WebKitTools/QueueStatusServer/templates/includes/singlequeuestatus.html @@ -0,0 +1,5 @@ +<span class="status-date">{{ status.date|timesince }} ago</span> +<span class="status-message">{{ status.message|force_escape|urlize|webkit_linkify|safe }}</span> +{% if status.results_file %} + <span class="status-results">[{{ status.key.id|results_link|safe }}]</span> +{% endif %} diff --git a/WebKitTools/QueueStatusServer/templates/queuestatus.html b/WebKitTools/QueueStatusServer/templates/queuestatus.html index 38c125f..d2d72c7 100644 --- a/WebKitTools/QueueStatusServer/templates/queuestatus.html +++ b/WebKitTools/QueueStatusServer/templates/queuestatus.html @@ -11,18 +11,31 @@ <div class="status-details"> <ul> - {% for status in statuses %} - <li>{% if status.active_bug_id %} - <span class="status-bug"> - Patch {{ status.active_patch_id|force_escape|webkit_attachment_id|safe }} from bug - {{ status.active_bug_id|force_escape|webkit_bug_id|safe }}: - </span>{% endif %} - <span class="status-message">{{ status.message|force_escape|urlize|webkit_linkify|safe }}</span> - {% if status.results_file %} - <span class="status-results">[{{ status.key.id|results_link|safe }}]</span> - {% endif %} - <span class="status-date">{{ status.date|timesince }} ago</span> - </li> + {% for status_group in status_groups %} + {% with status_group.0 as title_status %} + <li class="status-group"> + {% if title_status.active_bug_id %} + <span class="status-bug"> + Patch {{ title_status.active_patch_id|force_escape|webkit_attachment_id|safe }} from bug + {{ title_status.active_bug_id|force_escape|webkit_bug_id|safe }}: + </span> + {% endif %} + + {% ifequal status_group|length 1 %} + {% with title_status as status %} + {% include 'includes/singlequeuestatus.html' %} + {% endwith %} + {% else %} + <ul> + {% for status in status_group %} + <li class="status"> + {% include 'includes/singlequeuestatus.html' %} + </li> + {% endfor %} + </ul> + {% endifequal %} + </li> + {% endwith %} {% endfor %} </ul> </div> diff --git a/WebKitTools/Scripts/build-webkit b/WebKitTools/Scripts/build-webkit index 4234905..cd43499 100755 --- a/WebKitTools/Scripts/build-webkit +++ b/WebKitTools/Scripts/build-webkit @@ -50,6 +50,7 @@ chdirWebKit(); my $showHelp = 0; my $clean = 0; my $minimal = 0; +my $v8 = 0; my $installHeaders; my $installLibs; my $prefixPath; @@ -197,9 +198,6 @@ my @features = ( { option => "xslt", desc => "Toggle XSLT support", define => "ENABLE_XSLT", default => 1, value => \$xsltSupport }, - { option => "file-writer", desc => "Toggle FileWriter support", - define => "ENABLE_FILE_WRITER", default => 0, value => \$fileWriterSupport }, - { option => "file-system", desc => "Toggle FileSystem support", define => "ENABLE_FILE_SYSTEM", default => 0, value => \$fileSystemSupport }, @@ -222,7 +220,8 @@ push @ARGV, split(/ /, $ENV{'BUILD_WEBKIT_ARGS'}) if ($ENV{'BUILD_WEBKIT_ARGS'}) foreach (@ARGV) { if ($_ eq '--minimal') { $minimal = 1; - last; + } elsif ($_ eq '--v8') { + $v8 = 1; } } @@ -250,6 +249,7 @@ Usage: $programName [options] [options to pass to build system] --install-headers=<path> Set installation path for the headers (Qt only) --install-libs=<path> Set installation path for the libraries (Qt only) + --v8 Use V8 as JavaScript engine (Qt only) --prefix=<path> Set installation prefix to the given path (Gtk only) --makeargs=<arguments> Optional Makefile flags @@ -266,6 +266,7 @@ my %options = ( 'prefix=s' => \$prefixPath, 'makeargs=s' => \$makeArgs, 'minimal' => \$minimal, + 'v8' => \$v8, ); # Build usage text and options list from features @@ -288,7 +289,7 @@ setConfiguration(); my $productDir = productDir(); # Remove 0 byte sized files from productDir after slave lost for Qt buildbots. -File::Find::find(\&unlinkZeroFiles, $productDir) if isQt(); +File::Find::find(\&unlinkZeroFiles, $productDir) if (isQt() && -e $productDir); sub unlinkZeroFiles () { @@ -395,6 +396,10 @@ if (isGtk()) { if ($minimal) { push @options, "CONFIG+=minimal"; } + + if ($v8) { + push @options, "CONFIG+=v8"; + } } # Force re-link of existing libraries if different than expected diff --git a/WebKitTools/Scripts/update-webgl-conformance-tests b/WebKitTools/Scripts/update-webgl-conformance-tests new file mode 100755 index 0000000..dfe20a1 --- /dev/null +++ b/WebKitTools/Scripts/update-webgl-conformance-tests @@ -0,0 +1,36 @@ +#!/usr/bin/env python +# 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. + +"""Wrapper around webkitpy/layout_tests/update-webgl-conformance-tests.py""" + +import webkitpy.layout_tests.update_webgl_conformance_tests +import sys + +if __name__ == '__main__': + sys.exit(webkitpy.layout_tests.update_webgl_conformance_tests.main()) diff --git a/WebKitTools/Scripts/update-webkit-chromium b/WebKitTools/Scripts/update-webkit-chromium index 8458f83..1db1826 100755 --- a/WebKitTools/Scripts/update-webkit-chromium +++ b/WebKitTools/Scripts/update-webkit-chromium @@ -29,13 +29,16 @@ # Update script for the WebKit Chromium Port. use File::Path; +use FindBin; use Getopt::Long; +use lib $FindBin::Bin; +use webkitdirs; chdir("WebKit/chromium") or die $!; # Find gclient or install it. my $gclientPath; -if (`gclient --version`) { +if (commandExists('gclient')) { $gclientPath = 'gclient'; } elsif (-e 'depot_tools/gclient') { $gclientPath = 'depot_tools/gclient'; diff --git a/WebKitTools/Scripts/webkitdirs.pm b/WebKitTools/Scripts/webkitdirs.pm index b4d3f60..2980750 100644 --- a/WebKitTools/Scripts/webkitdirs.pm +++ b/WebKitTools/Scripts/webkitdirs.pm @@ -258,6 +258,7 @@ sub jscPath($) my ($productDir) = @_; my $jscName = "jsc"; $jscName .= "_debug" if (isCygwin() && ($configuration eq "Debug")); + $jscName .= ".exe" if (isWindows() || isCygwin()); return "$productDir/$jscName" if -e "$productDir/$jscName"; return "$productDir/JavaScriptCore.framework/Resources/$jscName"; } diff --git a/WebKitTools/Scripts/webkitperl/VCSUtils_unittest/fixChangeLogPatch.pl b/WebKitTools/Scripts/webkitperl/VCSUtils_unittest/fixChangeLogPatch.pl index 2fd187b..ee258da 100644 --- a/WebKitTools/Scripts/webkitperl/VCSUtils_unittest/fixChangeLogPatch.pl +++ b/WebKitTools/Scripts/webkitperl/VCSUtils_unittest/fixChangeLogPatch.pl @@ -30,7 +30,7 @@ # Unit tests of VCSUtils::fixChangeLogPatch(). -use Test::Simple tests => 8; +use Test::Simple tests => 12; use VCSUtils; # The source ChangeLog for these tests is the following: @@ -58,6 +58,93 @@ my $in; my $out; # New test +$title = "fixChangeLogPatch: [no change] In-place change."; + +$in = <<'END'; +--- ChangeLog ++++ ChangeLog +@@ -1,5 +1,5 @@ + 2010-12-22 Bob <bob@email.address> + +- Reviewed by Sue. ++ Reviewed by Ray. + + Changed some code on 2010-12-22. +END + +ok(fixChangeLogPatch($in) eq $in, $title); + +# New test +$title = "fixChangeLogPatch: [no change] Remove first entry."; + +$in = <<'END'; +--- ChangeLog ++++ ChangeLog +@@ -1,11 +1,3 @@ +-2010-12-22 Bob <bob@email.address> +- +- Reviewed by Ray. +- +- Changed some code on 2010-12-22. +- +- * File: +- + 2010-12-22 Alice <alice@email.address> + + Reviewed by Ray. +END + +ok(fixChangeLogPatch($in) eq $in, $title); + +# New test +$title = "fixChangeLogPatch: [no change] Remove entry in the middle."; + +$in = <<'END'; +--- ChangeLog ++++ ChangeLog +@@@ -7,10 +7,6 @@ + + * File: + +-2010-12-22 Bob <bob@email.address> +- +- Changed some code on 2010-12-22. +- + 2010-12-22 Alice <alice@email.address> + + Reviewed by Ray. +END + +ok(fixChangeLogPatch($in) eq $in, $title); + +# New test +$title = "fixChangeLogPatch: [no change] Far apart changes (i.e. more than one chunk)."; + +$in = <<'END'; +--- ChangeLog ++++ ChangeLog +@@ -7,7 +7,7 @@ + + * File: + +-2010-12-22 Bob <bob@email.address> ++2010-12-22 Bobby <bob@email.address> + + Changed some code on 2010-12-22. + +@@ -21,7 +21,7 @@ + + * File2: + +-2010-12-21 Bob <bob@email.address> ++2010-12-21 Bobby <bob@email.address> + + Changed some code on 2010-12-21. +END + +ok(fixChangeLogPatch($in) eq $in, $title); + +# New test $title = "fixChangeLogPatch: [no change] First line is new line."; $in = <<'END'; diff --git a/WebKitTools/Scripts/webkitpy/common/config/committers.py b/WebKitTools/Scripts/webkitpy/common/config/committers.py index 6a45cab..113131f 100644 --- a/WebKitTools/Scripts/webkitpy/common/config/committers.py +++ b/WebKitTools/Scripts/webkitpy/common/config/committers.py @@ -77,6 +77,7 @@ committers_unable_to_review = [ Committer("Andy Estes", "aestes@apple.com", "estes"), Committer("Anthony Ricaud", "rik@webkit.org", "rik"), Committer("Anton Muhin", "antonm@chromium.org", "antonm"), + Committer("Balazs Kelemen", "kbalazs@webkit.org", "kbalazs"), Committer("Ben Murdoch", "benm@google.com", "benm"), Committer("Benjamin C Meyer", ["ben@meyerhome.net", "ben@webkit.org"], "icefox"), Committer("Benjamin Otte", ["otte@gnome.org", "otte@webkit.org"], "otte"), @@ -92,7 +93,6 @@ committers_unable_to_review = [ Committer("Chris Rogers", "crogers@google.com", "crogers"), Committer("Christian Dywan", ["christian@twotoasts.de", "christian@webkit.org"]), Committer("Collin Jackson", "collinj@webkit.org"), - Committer("Csaba Osztrogonac", "ossy@webkit.org", "ossy"), Committer("David Smith", ["catfish.man@gmail.com", "dsmith@webkit.org"], "catfishman"), Committer("Dean Jackson", "dino@apple.com", "dino"), Committer("Diego Gonzalez", ["diegohcg@webkit.org", "diego.gonzalez@openbossa.org"], "diegohcg"), @@ -148,6 +148,7 @@ committers_unable_to_review = [ Committer("Maxime Simon", ["simon.maxime@gmail.com", "maxime.simon@webkit.org"], "maxime.simon"), Committer("Michael Saboff", "msaboff@apple.com"), Committer("Michelangelo De Simone", "michelangelo@webkit.org", "michelangelo"), + Committer("Mihai Parparita", "mihaip@chromium.org", "mihaip"), Committer("Mike Belshe", ["mbelshe@chromium.org", "mike@belshe.com"]), Committer("Mike Fenton", ["mifenton@rim.com", "mike.fenton@torchmobile.com"], "mfenton"), Committer("Mike Thole", ["mthole@mikethole.com", "mthole@apple.com"]), @@ -156,6 +157,7 @@ committers_unable_to_review = [ Committer("Nico Weber", ["thakis@chromium.org", "thakis@google.com"], "thakis"), Committer("Noam Rosenthal", "noam.rosenthal@nokia.com", "noamr"), Committer("Pam Greene", "pam@chromium.org", "pamg"), + Committer("Patrick Gansterer", ["paroga@paroga.com", "paroga@webkit.org"], "paroga"), Committer("Peter Kasting", ["pkasting@google.com", "pkasting@chromium.org"], "pkasting"), Committer("Philippe Normand", ["pnormand@igalia.com", "philn@webkit.org"], "philn-tp"), Committer("Pierre d'Herbemont", ["pdherbemont@free.fr", "pdherbemont@apple.com"], "pdherbemont"), @@ -211,6 +213,7 @@ reviewers_list = [ Reviewer("Chris Marrin", "cmarrin@apple.com", "cmarrin"), Reviewer("Chris Fleizach", "cfleizach@apple.com", "cfleizach"), Reviewer("Chris Jerdonek", "cjerdonek@webkit.org", "cjerdonek"), + Reviewer(u"Csaba Osztrogon\u00e1c", "ossy@webkit.org", "ossy"), Reviewer("Dan Bernstein", ["mitz@webkit.org", "mitz@apple.com"], "mitzpettel"), Reviewer("Daniel Bates", "dbates@webkit.org", "dydz"), Reviewer("Darin Adler", "darin@apple.com", "darin"), diff --git a/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py b/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py index 2b2258e..cc64fac 100644 --- a/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py +++ b/WebKitTools/Scripts/webkitpy/common/net/bugzilla.py @@ -175,6 +175,20 @@ class Bug(object): def is_unassigned(self): return self.assigned_to_email() in self.unassigned_emails + def status(self): + return self.bug_dictionary["bug_status"] + + # Bugzilla has many status states we don't really use in WebKit: + # https://bugs.webkit.org/page.cgi?id=fields.html#status + _open_states = ["UNCONFIRMED", "NEW", "ASSIGNED", "REOPENED"] + _closed_states = ["RESOLVED", "VERIFIED", "CLOSED"] + + def is_open(self): + return self.status() in self._open_states + + def is_closed(self): + return not self.is_open() + # Rarely do we actually want obsolete attachments def attachments(self, include_obsolete=False): attachments = self.bug_dictionary["attachments"] @@ -357,15 +371,14 @@ class CommitterValidator(object): return False return True + def _reject_patch_if_flags_are_invalid(self, patch): + return (self._validate_setter_email( + patch, "reviewer", self.reject_patch_from_review_queue) + and self._validate_setter_email( + patch, "committer", self.reject_patch_from_commit_queue)) + def patches_after_rejecting_invalid_commiters_and_reviewers(self, patches): - validated_patches = [] - for patch in patches: - if (self._validate_setter_email( - patch, "reviewer", self.reject_patch_from_review_queue) - and self._validate_setter_email( - patch, "committer", self.reject_patch_from_commit_queue)): - validated_patches.append(patch) - return validated_patches + return [patch for patch in patches if self._reject_patch_if_flags_are_invalid(patch)] def reject_patch_from_commit_queue(self, attachment_id, @@ -500,6 +513,7 @@ class Bugzilla(object): bug = {} bug["id"] = int(soup.find("bug_id").string) bug["title"] = self._string_contents(soup.find("short_desc")) + bug["bug_status"] = self._string_contents(soup.find("bug_status")) bug["reporter_email"] = self._string_contents(soup.find("reporter")) bug["assigned_to_email"] = self._string_contents(soup.find("assigned_to")) bug["cc_emails"] = [self._string_contents(element) diff --git a/WebKitTools/Scripts/webkitpy/common/net/bugzilla_unittest.py b/WebKitTools/Scripts/webkitpy/common/net/bugzilla_unittest.py index 280696e..32f23cd 100644 --- a/WebKitTools/Scripts/webkitpy/common/net/bugzilla_unittest.py +++ b/WebKitTools/Scripts/webkitpy/common/net/bugzilla_unittest.py @@ -213,6 +213,7 @@ ZEZpbmlzaExvYWRXaXRoUmVhc29uOnJlYXNvbl07Cit9CisKIEBlbmQKIAogI2VuZGlmCg== "cc_emails" : ["foo@bar.com", "example@example.com"], "reporter_email" : "eric@webkit.org", "assigned_to_email" : "webkit-unassigned@lists.webkit.org", + "bug_status": "NEW", "attachments" : [{ "attach_date": datetime.datetime(2009, 12, 27, 23, 51), 'name': u'Patch', diff --git a/WebKitTools/Scripts/webkitpy/common/net/statusserver.py b/WebKitTools/Scripts/webkitpy/common/net/statusserver.py index c8fced6..57390b8 100644 --- a/WebKitTools/Scripts/webkitpy/common/net/statusserver.py +++ b/WebKitTools/Scripts/webkitpy/common/net/statusserver.py @@ -96,6 +96,11 @@ class StatusServer: self.browser["work_items"] = " ".join(work_items) return self.browser.submit().read() + def next_work_item(self, queue_name): + _log.debug("Fetching next work item for %s" % queue_name) + patch_status_url = "%s/next-patch/%s" % (self.url, queue_name) + return self._fetch_url(patch_status_url) + def update_work_items(self, queue_name, work_items): _log.debug("Recording work items: %s for %s" % (work_items, queue_name)) return NetworkTransaction().run(lambda: self._post_work_items_to_server(queue_name, work_items)) diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py b/WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py index c543d91..51dcac8 100644 --- a/WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py +++ b/WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests.py @@ -36,8 +36,10 @@ import os import subprocess import sys import re +import webkitpy.common.checkout.scm as scm import webkitpy.common.system.executive as executive import webkitpy.common.system.logutils as logutils +import webkitpy.common.system.ospath as ospath import webkitpy.layout_tests.port.factory as port_factory _log = logutils.get_logger(__file__) @@ -52,11 +54,14 @@ def port_fallbacks(): back on. All platforms fall back on 'base'. """ fallbacks = {_BASE_PLATFORM: []} - for port_name in os.listdir(os.path.join('LayoutTests', 'platform')): + platform_dir = os.path.join(scm.find_checkout_root(), 'LayoutTests', + 'platform') + for port_name in os.listdir(platform_dir): try: platforms = port_factory.get(port_name).baseline_search_path() except NotImplementedError: - _log.error("'%s' lacks baseline_search_path(), please fix." % port_name) + _log.error("'%s' lacks baseline_search_path(), please fix." + % port_name) fallbacks[port_name] = [_BASE_PLATFORM] continue fallbacks[port_name] = [os.path.basename(p) for p in platforms][1:] @@ -102,7 +107,8 @@ def cluster_file_hashes(glob_pattern): # Fill in the map. cmd = ('git', 'ls-tree', '-r', 'HEAD', 'LayoutTests') try: - git_output = executive.Executive().run_command(cmd) + git_output = executive.Executive().run_command(cmd, + cwd=scm.find_checkout_root()) except OSError, e: if e.errno == 2: # No such file or directory. _log.error("Error: 'No such file' when running git.") @@ -156,11 +162,28 @@ def has_intermediate_results(test, fallbacks, matching_platform, return False -def find_dups(hashes, port_fallbacks): +def get_relative_test_path(filename, relative_to, + checkout_root=scm.find_checkout_root()): + """Constructs a relative path to |filename| from |relative_to|. + Args: + filename: The test file we're trying to get a relative path to. + relative_to: The absolute path we're relative to. + Returns: + A relative path to filename or None if |filename| is not below + |relative_to|. + """ + layout_test_dir = os.path.join(checkout_root, 'LayoutTests') + abs_path = os.path.join(layout_test_dir, filename) + return ospath.relpath(abs_path, relative_to) + + +def find_dups(hashes, port_fallbacks, relative_to): """Yields info about redundant test expectations. Args: hashes: a list of hashes as returned by cluster_file_hashes. - port_fallbacks: a list of fallback information as returned by get_port_fallbacks. + port_fallbacks: a list of fallback information as returned by + get_port_fallbacks. + relative_to: the directory that we want the results relative to Returns: a tuple containing (test, platform, fallback, platforms) """ @@ -176,13 +199,24 @@ def find_dups(hashes, port_fallbacks): # See if any of the platforms are redundant with each other. for platform in platforms.keys(): for fallback in port_fallbacks[platform]: - if fallback in platforms.keys(): - # We have to verify that there isn't an intermediate result - # that causes this duplicate hash to exist. - if not has_intermediate_results(test, - port_fallbacks[platform], fallback): - path = os.path.join('LayoutTests', platforms[platform]) - yield test, platform, fallback, path + if fallback not in platforms.keys(): + continue + # We have to verify that there isn't an intermediate result + # that causes this duplicate hash to exist. + if has_intermediate_results(test, port_fallbacks[platform], + fallback): + continue + # We print the relative path so it's easy to pipe the results + # to xargs rm. + path = get_relative_test_path(platforms[platform], relative_to) + if not path: + continue + yield { + 'test': test, + 'platform': platform, + 'fallback': fallback, + 'path': path, + } def deduplicate(glob_pattern): @@ -194,5 +228,4 @@ def deduplicate(glob_pattern): """ fallbacks = port_fallbacks() hashes = cluster_file_hashes(glob_pattern) - return [{'test': test, 'path': path, 'platform': platform, 'fallback': fallback} - for test, platform, fallback, path in find_dups(hashes, fallbacks)] + return list(find_dups(hashes, fallbacks, os.getcwd())) diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py b/WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py index be2e381..bb9604f 100644 --- a/WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py +++ b/WebKitTools/Scripts/webkitpy/layout_tests/deduplicate_tests_unittest.py @@ -186,3 +186,22 @@ class ListDuplicatesTest(unittest.TestCase): 'fallback': 'chromium-win', 'platform': 'chromium-linux'}, result[0]) + + def test_get_relative_test_path(self): + checkout_root = scm.find_checkout_root() + layout_test_dir = os.path.join(checkout_root, 'LayoutTests') + test_cases = ( + ('platform/mac/test.html', + ('platform/mac/test.html', layout_test_dir)), + ('LayoutTests/platform/mac/test.html', + ('platform/mac/test.html', checkout_root)), + (None, + ('platform/mac/test.html', os.path.join(checkout_root, 'WebCore'))), + ('test.html', + ('platform/mac/test.html', os.path.join(layout_test_dir, 'platform/mac'))), + (None, + ('platform/mac/test.html', os.path.join(layout_test_dir, 'platform/win'))), + ) + for expected, inputs in test_cases: + self.assertEquals(expected, + deduplicate_tests.get_relative_test_path(*inputs)) diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/layout_package/dump_render_tree_thread.py b/WebKitTools/Scripts/webkitpy/layout_tests/layout_package/dump_render_tree_thread.py index 9b963ca..970de60 100644 --- a/WebKitTools/Scripts/webkitpy/layout_tests/layout_package/dump_render_tree_thread.py +++ b/WebKitTools/Scripts/webkitpy/layout_tests/layout_package/dump_render_tree_thread.py @@ -72,20 +72,19 @@ def log_stack(stack): _log.error(' %s' % line.strip()) -def _process_output(port, test_info, test_types, test_args, configuration, - output_dir, crash, timeout, test_run_time, actual_checksum, +def _process_output(port, options, test_info, test_types, test_args, + crash, timeout, test_run_time, actual_checksum, output, error): """Receives the output from a DumpRenderTree process, subjects it to a number of tests, and returns a list of failure types the test produced. Args: port: port-specific hooks + options: command line options argument from optparse proc: an active DumpRenderTree process test_info: Object containing the test filename, uri and timeout test_types: list of test types to subject the output to test_args: arguments to be passed to each test - configuration: Debug or Release - output_dir: directory to put crash stack traces into Returns: a TestResult object """ @@ -106,7 +105,8 @@ def _process_output(port, test_info, test_types, test_args, configuration, _log.debug("Stacktrace for %s:\n%s" % (test_info.filename, error)) # Strip off "file://" since RelativeTestFilename expects # filesystem paths. - filename = os.path.join(output_dir, port.relative_test_filename( + filename = os.path.join(options.results_directory, + port.relative_test_filename( test_info.filename)) filename = os.path.splitext(filename)[0] + "-stack.txt" port.maybe_make_directory(os.path.split(filename)[0]) @@ -122,7 +122,7 @@ def _process_output(port, test_info, test_types, test_args, configuration, start_diff_time = time.time() new_failures = test_type.compare_output(port, test_info.filename, output, local_test_args, - configuration) + options.configuration) # Don't add any more failures if we already have a crash, so we don't # double-report those tests. We do double-report for timeouts since # we still want to see the text and image output. @@ -166,25 +166,23 @@ class TestResult(object): class SingleTestThread(threading.Thread): """Thread wrapper for running a single test file.""" - def __init__(self, port, image_path, shell_args, test_info, - test_types, test_args, configuration, output_dir): + def __init__(self, port, options, test_info, test_types, test_args): """ Args: port: object implementing port-specific hooks + options: command line argument object from optparse test_info: Object containing the test filename, uri and timeout - output_dir: Directory to put crash stacks into. - See TestShellThread for documentation of the remaining arguments. + test_types: A list of TestType objects to run the test output + against. + test_args: A TestArguments object to pass to each TestType. """ threading.Thread.__init__(self) self._port = port - self._image_path = image_path - self._shell_args = shell_args + self._options = options self._test_info = test_info self._test_types = test_types self._test_args = test_args - self._configuration = configuration - self._output_dir = output_dir self._driver = None def run(self): @@ -194,17 +192,17 @@ class SingleTestThread(threading.Thread): # FIXME: this is a separate routine to work around a bug # in coverage: see http://bitbucket.org/ned/coveragepy/issue/85. test_info = self._test_info - self._driver = self._port.create_driver(self._image_path, - self._shell_args) + self._driver = self._port.create_driver(self._test_args.png_path, + self._options) self._driver.start() start = time.time() crash, timeout, actual_checksum, output, error = \ self._driver.run_test(test_info.uri.strip(), test_info.timeout, test_info.image_hash()) end = time.time() - self._test_result = _process_output(self._port, + self._test_result = _process_output(self._port, self._options, test_info, self._test_types, self._test_args, - self._configuration, self._output_dir, crash, timeout, end - start, + crash, timeout, end - start, actual_checksum, output, error) self._driver.stop() @@ -248,12 +246,13 @@ class WatchableThread(threading.Thread): class TestShellThread(WatchableThread): - def __init__(self, port, filename_list_queue, result_queue, - test_types, test_args, image_path, shell_args, options): + def __init__(self, port, options, filename_list_queue, result_queue, + test_types, test_args): """Initialize all the local state for this DumpRenderTree thread. Args: port: interface to port-specific hooks + options: command line options argument from optparse filename_list_queue: A thread safe Queue class that contains lists of tuples of (filename, uri) pairs. result_queue: A thread safe Queue class that will contain tuples of @@ -261,22 +260,17 @@ class TestShellThread(WatchableThread): test_types: A list of TestType objects to run the test output against. test_args: A TestArguments object to pass to each TestType. - shell_args: Any extra arguments to be passed to DumpRenderTree. - options: A property dictionary as produced by optparse. The - command-line options should match those expected by - run_webkit_tests; they are typically passed via the - run_webkit_tests.TestRunner class.""" + + """ WatchableThread.__init__(self) self._port = port + self._options = options self._filename_list_queue = filename_list_queue self._result_queue = result_queue self._filename_list = [] self._test_types = test_types self._test_args = test_args self._driver = None - self._image_path = image_path - self._shell_args = shell_args - self._options = options self._directory_timing_stats = {} self._test_results = [] self._num_tests = 0 @@ -433,13 +427,11 @@ class TestShellThread(WatchableThread): A TestResult """ - worker = SingleTestThread(self._port, self._image_path, - self._shell_args, + worker = SingleTestThread(self._port, + self._options, test_info, self._test_types, - self._test_args, - self._options.configuration, - self._options.results_directory) + self._test_args) worker.start() @@ -503,11 +495,11 @@ class TestShellThread(WatchableThread): self._driver.run_test(test_info.uri, test_info.timeout, image_hash) end = time.time() - result = _process_output(self._port, test_info, self._test_types, - self._test_args, self._options.configuration, - self._options.results_directory, crash, - timeout, end - start, actual_checksum, - output, error) + result = _process_output(self._port, self._options, + test_info, self._test_types, + self._test_args, crash, + timeout, end - start, actual_checksum, + output, error) self._test_results.append(result) return result @@ -521,7 +513,8 @@ class TestShellThread(WatchableThread): # poll() is not threadsafe and can throw OSError due to: # http://bugs.python.org/issue1731717 if (not self._driver or self._driver.poll() is not None): - self._driver = self._port.create_driver(self._image_path, self._shell_args) + self._driver = self._port.create_driver(self._test_args.png_path, + self._options) self._driver.start() def _kill_dump_render_tree(self): diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py index 9125f9e..70beac3 100644 --- a/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py +++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py @@ -152,6 +152,16 @@ class Port(object): While this is a generic routine, we include it in the Port interface so that it can be overriden for testing purposes.""" + + # The filenames show up in the diff output, make sure they're + # raw bytes and not unicode, so that they don't trigger join() + # trying to decode the input. + def to_raw_bytes(str): + if isinstance(str, unicode): + return str.encode('utf-8') + return str + expected_filename = to_raw_bytes(expected_filename) + actual_filename = to_raw_bytes(actual_filename) diff = difflib.unified_diff(expected_text.splitlines(True), actual_text.splitlines(True), expected_filename, @@ -364,7 +374,7 @@ class Port(object): results_filename in a users' browser.""" raise NotImplementedError('Port.show_html_results_file') - def create_driver(self, png_path, options): + def create_driver(self, image_path, options): """Return a newly created base.Driver subclass for starting/stopping the test driver.""" raise NotImplementedError('Port.create_driver') @@ -678,7 +688,7 @@ class Port(object): class Driver: """Abstract interface for the DumpRenderTree interface.""" - def __init__(self, port, png_path, options): + def __init__(self, port, png_path, options, executive): """Initialize a Driver to subsequently run tests. Typically this routine will spawn DumpRenderTree in a config @@ -688,7 +698,10 @@ class Driver: png_path - an absolute path for the driver to write any image data for a test (as a PNG). If no path is provided, that indicates that pixel test results will not be checked. - options - any port-specific driver options.""" + options - command line options argument from optparse + executive - reference to the process-wide Executive object + + """ raise NotImplementedError('Driver.__init__') def run_test(self, uri, timeout, checksum): diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/base_unittest.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/base_unittest.py index 1cc426f..780cd22 100644 --- a/WebKitTools/Scripts/webkitpy/layout_tests/port/base_unittest.py +++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/base_unittest.py @@ -66,7 +66,7 @@ class UnitTestPort(base.Port): def _open_configuration_file(self): if self._configuration_contents: return NewStringIO(self._configuration_contents) - return base.Port._open_configuration_file(self) + raise IOError class PortTest(unittest.TestCase): @@ -163,6 +163,33 @@ class PortTest(unittest.TestCase): self.assertFalse(base._wdiff_available) base._wdiff_available = True + def test_diff_text(self): + port = base.Port() + # Make sure that we don't run into decoding exceptions when the + # filenames are unicode, with regular or malformed input (expected or + # actual input is always raw bytes, not unicode). + port.diff_text('exp', 'act', 'exp.txt', 'act.txt') + port.diff_text('exp', 'act', u'exp.txt', 'act.txt') + port.diff_text('exp', 'act', u'a\xac\u1234\u20ac\U00008000', 'act.txt') + + port.diff_text('exp' + chr(255), 'act', 'exp.txt', 'act.txt') + port.diff_text('exp' + chr(255), 'act', u'exp.txt', 'act.txt') + + # Though expected and actual files should always be read in with no + # encoding (and be stored as str objects), test unicode inputs just to + # be safe. + port.diff_text(u'exp', 'act', 'exp.txt', 'act.txt') + port.diff_text( + u'a\xac\u1234\u20ac\U00008000', 'act', 'exp.txt', 'act.txt') + + # And make sure we actually get diff output. + diff = port.diff_text('foo', 'bar', 'exp.txt', 'act.txt') + self.assertTrue('foo' in diff) + self.assertTrue('bar' in diff) + self.assertTrue('exp.txt' in diff) + self.assertTrue('act.txt' in diff) + self.assertFalse('nosuchthing' in diff) + def test_default_configuration_notfound(self): port = UnitTestPort() self.assertEqual(port.default_configuration(), "Release") @@ -223,8 +250,8 @@ class VirtualTest(unittest.TestCase): self.assertVirtual(port._shut_down_http_server, None) def test_virtual_driver_method(self): - self.assertRaises(NotImplementedError, base.Driver, base.Port, "", None) - self.assertVirtual(base.Driver, base.Port, "", None) + self.assertRaises(NotImplementedError, base.Driver, base.Port(), + "", None, None) def test_virtual_driver_methods(self): class VirtualDriver(base.Driver): diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium.py index 896eab1..3fc4613 100644 --- a/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium.py +++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium.py @@ -194,13 +194,11 @@ class ChromiumPort(base.Port): def create_driver(self, image_path, options): """Starts a new Driver and returns a handle to it.""" - if self._options.use_drt and sys.platform == 'darwin': - return webkit.WebKitDriver(self, image_path, options, executive=self._executive) - if self._options.use_drt: - options += ['--test-shell'] - else: - options += ['--layout-tests'] - return ChromiumDriver(self, image_path, options, executive=self._executive) + if options.use_drt and sys.platform == 'darwin': + return webkit.WebKitDriver(self, image_path, options, + executive=self._executive) + return ChromiumDriver(self, image_path, options, + executive=self._executive) def start_helper(self): helper_path = self._path_to_helper() @@ -337,22 +335,32 @@ class ChromiumDriver(base.Driver): def __init__(self, port, image_path, options, executive=Executive()): self._port = port - self._configuration = port._options.configuration - # FIXME: _options is very confusing, because it's not an Options() element. - # FIXME: These don't need to be passed into the constructor, but could rather - # be passed into .start() self._options = options self._image_path = image_path self._executive = executive + def _driver_args(self): + driver_args = [] + if self._image_path: + driver_args.append("--pixel-tests=" + self._image_path) + + if self._options.use_drt: + driver_args.append('--test-shell') + else: + driver_args.append('--layout-tests') + + if self._options.startup_dialog: + driver_args.append('--testshell-startup-dialog') + + if self._options.gp_fault_error_box: + driver_args.append('--gp-fault-error-box') + return driver_args + def start(self): # FIXME: Should be an error to call this method twice. - cmd = [] - # FIXME: We should not be grabbing at self._port._options.wrapper directly. - cmd += self._command_wrapper(self._port._options.wrapper) - cmd += [self._port._path_to_driver()] - if self._options: - cmd += self._options + cmd = self._command_wrapper(self._options.wrapper) + cmd.append(self._port._path_to_driver()) + cmd += self._driver_args() # We need to pass close_fds=True to work around Python bug #2320 # (otherwise we can hang when we kill DumpRenderTree when we are running diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/dryrun.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/dryrun.py index 1af01ad..4940e4c 100644 --- a/WebKitTools/Scripts/webkitpy/layout_tests/port/dryrun.py +++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/dryrun.py @@ -86,6 +86,7 @@ class DryRunPort(object): port_name = port_name[len(pfx):] else: port_name = None + self._options = options self.__delegate = factory.get(port_name, options) def __getattr__(self, name): @@ -116,16 +117,17 @@ class DryRunPort(object): pass def create_driver(self, image_path, options): - return DryrunDriver(self, image_path, options) + return DryrunDriver(self, image_path, options, executive=None) class DryrunDriver(base.Driver): """Dryrun implementation of the DumpRenderTree / Driver interface.""" - def __init__(self, port, image_path, test_driver_options): + def __init__(self, port, image_path, options, executive): self._port = port - self._driver_options = test_driver_options + self._options = options self._image_path = image_path + self._executive = executive self._layout_tests_dir = None def poll(self): diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/test.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/test.py index a3a16c3..2ccddb0 100644 --- a/WebKitTools/Scripts/webkitpy/layout_tests/port/test.py +++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/test.py @@ -97,7 +97,7 @@ class TestPort(base.Port): pass def create_driver(self, image_path, options): - return TestDriver(image_path, options, self) + return TestDriver(self, image_path, options, executive=None) def start_http_server(self): pass @@ -139,10 +139,11 @@ class TestPort(base.Port): class TestDriver(base.Driver): """Test/Dummy implementation of the DumpRenderTree interface.""" - def __init__(self, image_path, test_driver_options, port): - self._driver_options = test_driver_options - self._image_path = image_path + def __init__(self, port, image_path, options, executive): self._port = port + self._image_path = image_path + self._options = options + self._executive = executive self._image_written = False def poll(self): @@ -204,7 +205,7 @@ class TestDriver(base.Driver): crash = False timeout = False output = basename + '-txt\n' - if self._port.options().pixel_tests and ( + if self._options.pixel_tests and ( 'image' in basename or 'check' in basename): checksum = basename + '-checksum\n' with open(self._image_path, "w") as f: diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py index b085ceb..88c9bdf 100644 --- a/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py +++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py @@ -199,7 +199,8 @@ class WebKitPort(base.Port): webbrowser.open(uri, new=1) def create_driver(self, image_path, options): - return WebKitDriver(self, image_path, options, executive=self._executive) + return WebKitDriver(self, image_path, options, + executive=self._executive) def test_base_platform_names(self): # At the moment we don't use test platform names, but we have @@ -405,22 +406,31 @@ class WebKitPort(base.Port): class WebKitDriver(base.Driver): """WebKit implementation of the DumpRenderTree interface.""" - def __init__(self, port, image_path, driver_options, executive=Executive()): + def __init__(self, port, image_path, options, executive=Executive()): self._port = port - # FIXME: driver_options is never used. self._image_path = image_path + self._options = options + self._executive = executive self._driver_tempdir = tempfile.mkdtemp(prefix='DumpRenderTree-') def __del__(self): shutil.rmtree(self._driver_tempdir) + def _driver_args(self): + driver_args = [] + if self._image_path: + driver_args.append('--pixel-tests') + + # These are used by the Chromium DRT port + if self._options.use_drt: + driver_args.append('--test-shell') + return driver_args + def start(self): - command = [] - # FIXME: We should not be grabbing at self._port._options.wrapper directly. - command += self._command_wrapper(self._port._options.wrapper) + command = self._command_wrapper(self._options.wrapper) command += [self._port._path_to_driver(), '-'] - if self._image_path: - command.append('--pixel-tests') + command += self._driver_args() + environment = self._port.setup_environ_for_server() environment['DYLD_FRAMEWORK_PATH'] = self._port._build_path() environment['DUMPRENDERTREE_TEMP'] = self._driver_tempdir diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py b/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py index 2e2da6d..14d4f0e 100755 --- a/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py +++ b/WebKitTools/Scripts/webkitpy/layout_tests/run_webkit_tests.py @@ -564,27 +564,18 @@ class TestRunner: filename_queue.put(item) return filename_queue - def _get_dump_render_tree_args(self, index): + def _get_test_args(self, index): """Returns the tuple of arguments for tests and for DumpRenderTree.""" - shell_args = [] test_args = test_type_base.TestArguments() - png_path = None + test_args.png_path = None if self._options.pixel_tests: png_path = os.path.join(self._options.results_directory, "png_result%s.png" % index) - shell_args.append("--pixel-tests=" + png_path) test_args.png_path = png_path - test_args.new_baseline = self._options.new_baseline test_args.reset_results = self._options.reset_results - if self._options.startup_dialog: - shell_args.append('--testshell-startup-dialog') - - if self._options.gp_fault_error_box: - shell_args.append('--gp-fault-error-box') - - return test_args, png_path, shell_args + return test_args def _contains_tests(self, subdir): for test_file in self._test_files: @@ -610,11 +601,10 @@ class TestRunner: test_types.append(test_type(self._port, self._options.results_directory)) - test_args, png_path, shell_args = \ - self._get_dump_render_tree_args(i) + test_args = self._get_test_args(i) thread = dump_render_tree_thread.TestShellThread(self._port, - filename_queue, self._result_queue, test_types, test_args, - png_path, shell_args, self._options) + self._options, filename_queue, self._result_queue, + test_types, test_args) if self._is_single_threaded(): thread.run_in_main_thread(self, result_summary) else: diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/update_webgl_conformance_tests.py b/WebKitTools/Scripts/webkitpy/layout_tests/update_webgl_conformance_tests.py new file mode 100755 index 0000000..f4c8098 --- /dev/null +++ b/WebKitTools/Scripts/webkitpy/layout_tests/update_webgl_conformance_tests.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python + +# 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: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 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. +# +# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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. + +from __future__ import with_statement + +import glob +import logging +import optparse +import os +import re +import sys +import webkitpy.common.checkout.scm as scm + +_log = logging.getLogger("webkitpy.layout_tests." + "update-webgl-conformance-tests") + + +def remove_first_line_comment(text): + return re.compile(r'^<!--.*?-->\s*', re.DOTALL).sub('', text) + + +def translate_includes(text): + # Mapping of single filename to relative path under WebKit root. + # Assumption: these filenames are globally unique. + include_mapping = { + "js-test-style.css": "../../js/resources", + "js-test-pre.js": "../../js/resources", + "js-test-post.js": "../../js/resources", + "desktop-gl-constants.js": "resources", + } + + for filename, path in include_mapping.items(): + search = r'(?:[^"\'= ]*/)?' + re.escape(filename) + replace = os.path.join(path, filename) + text = re.sub(search, replace, text) + + return text + + +def translate_khronos_test(text): + """ + This method translates the contents of a Khronos test to a WebKit test. + """ + + translateFuncs = [ + remove_first_line_comment, + translate_includes, + ] + + for f in translateFuncs: + text = f(text) + + return text + + +def update_file(in_filename, out_dir): + # check in_filename exists + # check out_dir exists + out_filename = os.path.join(out_dir, os.path.basename(in_filename)) + + _log.debug("Processing " + in_filename) + with open(in_filename, 'r') as in_file: + with open(out_filename, 'w') as out_file: + out_file.write(translate_khronos_test(in_file.read())) + + +def update_directory(in_dir, out_dir): + for filename in glob.glob(os.path.join(in_dir, '*.html')): + update_file(os.path.join(in_dir, filename), out_dir) + + +def default_out_dir(): + current_scm = scm.detect_scm_system(os.path.dirname(sys.argv[0])) + if not current_scm: + return os.getcwd() + root_dir = current_scm.checkout_root + if not root_dir: + return os.getcwd() + out_dir = os.path.join(root_dir, "LayoutTests/fast/canvas/webgl") + if os.path.isdir(out_dir): + return out_dir + return os.getcwd() + + +def configure_logging(options): + """Configures the logging system.""" + log_fmt = '%(levelname)s: %(message)s' + log_datefmt = '%y%m%d %H:%M:%S' + log_level = logging.INFO + if options.verbose: + log_fmt = ('%(asctime)s %(filename)s:%(lineno)-4d %(levelname)s ' + '%(message)s') + log_level = logging.DEBUG + logging.basicConfig(level=log_level, format=log_fmt, + datefmt=log_datefmt) + + +def option_parser(): + usage = "usage: %prog [options] (input file or directory)" + parser = optparse.OptionParser(usage=usage) + parser.add_option('-v', '--verbose', + action='store_true', + default=False, + help='include debug-level logging') + parser.add_option('-o', '--output', + action='store', + type='string', + default=default_out_dir(), + metavar='DIR', + help='specify an output directory to place files ' + 'in [default: %default]') + return parser + + +def main(): + parser = option_parser() + (options, args) = parser.parse_args() + configure_logging(options) + + if len(args) == 0: + _log.error("Must specify an input directory or filename.") + parser.print_help() + return 1 + + in_name = args[0] + if os.path.isfile(in_name): + update_file(in_name, options.output) + elif os.path.isdir(in_name): + update_directory(in_name, options.output) + else: + _log.error("'%s' is not a directory or a file.", in_name) + return 2 + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/update_webgl_conformance_tests_unittest.py b/WebKitTools/Scripts/webkitpy/layout_tests/update_webgl_conformance_tests_unittest.py new file mode 100644 index 0000000..7393b70 --- /dev/null +++ b/WebKitTools/Scripts/webkitpy/layout_tests/update_webgl_conformance_tests_unittest.py @@ -0,0 +1,102 @@ +#!/usr/bin/python +# 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. + +"""Unit tests for update_webgl_conformance_tests.""" + +import unittest +from webkitpy.layout_tests import update_webgl_conformance_tests as webgl + + +def construct_script(name): + return "<script src=\"" + name + "\"></script>\n" + + +def construct_style(name): + return "<link rel=\"stylesheet\" href=\"" + name + "\">" + + +class TestTranslation(unittest.TestCase): + def assert_unchanged(self, text): + self.assertEqual(text, webgl.translate_khronos_test(text)) + + def assert_translate(self, input, output): + self.assertEqual(output, webgl.translate_khronos_test(input)) + + def test_simple_unchanged(self): + self.assert_unchanged("") + self.assert_unchanged("<html></html>") + + def test_header_strip(self): + single_line_header = "<!-- single line header. -->" + multi_line_header = """<!-- this is a multi-line + header. it should all be removed too. + -->""" + text = "<html></html>" + self.assert_translate(single_line_header, "") + self.assert_translate(single_line_header + text, text) + self.assert_translate(multi_line_header + text, text) + + def dont_strip_other_headers(self): + self.assert_unchanged("<html>\n<!-- don't remove comments on other lines. -->\n</html>") + + def test_include_rewriting(self): + # Mappings to None are unchanged + styles = { + "../resources/js-test-style.css": "../../js/resources/js-test-style.css", + "fail.css": None, + "resources/stylesheet.css": None, + "../resources/style.css": None, + } + scripts = { + "../resources/js-test-pre.js": "../../js/resources/js-test-pre.js", + "../resources/js-test-post.js": "../../js/resources/js-test-post.js", + "../resources/desktop-gl-constants.js": "resources/desktop-gl-constants.js", + + "resources/shadow-offset.js": None, + "../resources/js-test-post-async.js": None, + } + + input_text = "" + output_text = "" + for input, output in styles.items(): + input_text += construct_style(input) + output_text += construct_style(output if output else input) + for input, output in scripts.items(): + input_text += construct_script(input) + output_text += construct_script(output if output else input) + + head = '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">\n<html>\n<head>\n' + foot = '</head>\n<body>\n</body>\n</html>' + input_text = head + input_text + foot + output_text = head + output_text + foot + self.assert_translate(input_text, output_text) + + +if __name__ == '__main__': + unittest.main() diff --git a/WebKitTools/Scripts/webkitpy/style/checkers/cpp.py b/WebKitTools/Scripts/webkitpy/style/checkers/cpp.py index 62f40ea..f8ebeff 100644 --- a/WebKitTools/Scripts/webkitpy/style/checkers/cpp.py +++ b/WebKitTools/Scripts/webkitpy/style/checkers/cpp.py @@ -2519,6 +2519,7 @@ def check_identifier_name_in_declaration(filename, line_number, line, error): and not modified_identifier.startswith('NPP_') and not modified_identifier.startswith('NP_') and not modified_identifier.startswith('qt_') + and not modified_identifier.startswith('cairo_') and not modified_identifier.find('::qt_') >= 0 and not modified_identifier == "const_iterator"): error(line_number, 'readability/naming', 4, identifier + " is incorrectly named. Don't use underscores in your identifier names.") diff --git a/WebKitTools/Scripts/webkitpy/style/checkers/cpp_unittest.py b/WebKitTools/Scripts/webkitpy/style/checkers/cpp_unittest.py index 16b1a3c..2f54305 100644 --- a/WebKitTools/Scripts/webkitpy/style/checkers/cpp_unittest.py +++ b/WebKitTools/Scripts/webkitpy/style/checkers/cpp_unittest.py @@ -3703,6 +3703,11 @@ class WebKitStyleTest(CppStyleTestBase): self.assert_lint('void QTFrame::qt_drt_is_awesome(int var1, int var2)', '') self.assert_lint('void qt_drt_is_awesome(int var1, int var2);', '') + # Cairo forward-declarations should not be a failure. + self.assert_lint('typedef struct _cairo cairo_t;', '') + self.assert_lint('typedef struct _cairo_surface cairo_surface_t;', '') + self.assert_lint('typedef struct _cairo_scaled_font cairo_scaled_font_t;', '') + # NPAPI functions that start with NPN_, NPP_ or NP_ are allowed. self.assert_lint('void NPN_Status(NPP, const char*)', '') self.assert_lint('NPError NPP_SetWindow(NPP instance, NPWindow *window)', '') diff --git a/WebKitTools/Scripts/webkitpy/tool/bot/queueengine.py b/WebKitTools/Scripts/webkitpy/tool/bot/queueengine.py index 36cbc5f..289dc4a 100644 --- a/WebKitTools/Scripts/webkitpy/tool/bot/queueengine.py +++ b/WebKitTools/Scripts/webkitpy/tool/bot/queueengine.py @@ -33,7 +33,6 @@ import traceback from datetime import datetime, timedelta -from webkitpy.common.net.statusserver import StatusServer from webkitpy.common.system.executive import ScriptError from webkitpy.common.system.deprecated_logging import log, OutputTee @@ -117,10 +116,10 @@ class QueueEngine: message = "Unexpected failure when processing patch! Please file a bug against webkit-patch.\n%s" % e.message_with_output() self._delegate.handle_unexpected_error(work_item, message) except TerminateQueue, e: - log("\nTerminateQueue exception received.") + self._stopping("TerminateQueue exception received.") return 0 except KeyboardInterrupt, e: - log("\nUser terminated queue.") + self._stopping("User terminated queue.") return 1 except Exception, e: traceback.print_exc() @@ -129,6 +128,13 @@ class QueueEngine: # Never reached. self._ensure_work_log_closed() + def _stopping(self, message): + log("\n%s" % message) + self._delegate.stop_work_queue(message) + # Be careful to shut down our OutputTee or the unit tests will be unhappy. + self._ensure_work_log_closed() + self._output_tee.remove_log(self._queue_log) + def _begin_logging(self): self._queue_log = self._output_tee.add_log(self._delegate.queue_log_path()) self._work_log = None diff --git a/WebKitTools/Scripts/webkitpy/tool/bot/queueengine_unittest.py b/WebKitTools/Scripts/webkitpy/tool/bot/queueengine_unittest.py index ec91bdb..bfec401 100644 --- a/WebKitTools/Scripts/webkitpy/tool/bot/queueengine_unittest.py +++ b/WebKitTools/Scripts/webkitpy/tool/bot/queueengine_unittest.py @@ -34,7 +34,9 @@ import threading import unittest from webkitpy.common.system.executive import ScriptError -from webkitpy.tool.bot.queueengine import QueueEngine, QueueEngineDelegate +from webkitpy.common.system.outputcapture import OutputCapture +from webkitpy.tool.bot.queueengine import QueueEngine, QueueEngineDelegate, TerminateQueue + class LoggingDelegate(QueueEngineDelegate): def __init__(self, test): @@ -94,14 +96,19 @@ class LoggingDelegate(QueueEngineDelegate): self._test.assertEquals(work_item, "work_item") -class ThrowErrorDelegate(LoggingDelegate): - def __init__(self, test, error_code): +class RaisingDelegate(LoggingDelegate): + def __init__(self, test, exception): LoggingDelegate.__init__(self, test) - self.error_code = error_code + self._exception = exception + self.stop_message = None def process_work_item(self, work_item): self.record("process_work_item") - raise ScriptError(exit_code=self.error_code) + raise self._exception + + def stop_work_queue(self, message): + self.record("stop_work_queue") + self.stop_message = message class NotSafeToProceedDelegate(LoggingDelegate): @@ -132,7 +139,7 @@ class QueueEngineTest(unittest.TestCase): self.assertTrue(os.path.exists(os.path.join(self.temp_dir, "work_log_path", "work_item.log"))) def test_unexpected_error(self): - delegate = ThrowErrorDelegate(self, 3) + delegate = RaisingDelegate(self, ScriptError(exit_code=3)) work_queue = QueueEngine("error-queue", delegate, threading.Event()) work_queue.run() expected_callbacks = LoggingDelegate.expected_callbacks[:] @@ -143,11 +150,32 @@ class QueueEngineTest(unittest.TestCase): self.assertEquals(delegate._callbacks, expected_callbacks) def test_handled_error(self): - delegate = ThrowErrorDelegate(self, QueueEngine.handled_error_code) + delegate = RaisingDelegate(self, ScriptError(exit_code=QueueEngine.handled_error_code)) work_queue = QueueEngine("handled-error-queue", delegate, threading.Event()) work_queue.run() self.assertEquals(delegate._callbacks, LoggingDelegate.expected_callbacks) + def _test_terminating_queue(self, exception, expected_message): + work_item_index = LoggingDelegate.expected_callbacks.index('process_work_item') + # The terminating error should be handled right after process_work_item. + # There should be no other callbacks after stop_work_queue. + expected_callbacks = LoggingDelegate.expected_callbacks[:work_item_index + 1] + expected_callbacks.append("stop_work_queue") + + delegate = RaisingDelegate(self, exception) + work_queue = QueueEngine("terminating-queue", delegate, threading.Event()) + + output = OutputCapture() + expected_stderr = "\n%s\n" % expected_message + output.assert_outputs(self, work_queue.run, [], expected_stderr=expected_stderr) + + self.assertEquals(delegate._callbacks, expected_callbacks) + self.assertEquals(delegate.stop_message, expected_message) + + def test_terminating_error(self): + self._test_terminating_queue(KeyboardInterrupt(), "User terminated queue.") + self._test_terminating_queue(TerminateQueue(), "TerminateQueue exception received.") + def test_not_safe_to_proceed(self): delegate = NotSafeToProceedDelegate(self) work_queue = FastQueueEngine(delegate) diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/download.py b/WebKitTools/Scripts/webkitpy/tool/commands/download.py index d27ab0e..ed0e3d6 100644 --- a/WebKitTools/Scripts/webkitpy/tool/commands/download.py +++ b/WebKitTools/Scripts/webkitpy/tool/commands/download.py @@ -194,6 +194,19 @@ class BuildAttachment(AbstractPatchSequencingCommand, ProcessAttachmentsMixin): ] +class BuildAndTestAttachment(AbstractPatchSequencingCommand, ProcessAttachmentsMixin): + name = "build-and-test-attachment" + help_text = "Apply, build, and test patches from bugzilla" + argument_names = "ATTACHMENT_ID [ATTACHMENT_IDS]" + main_steps = [ + steps.CleanWorkingDirectory, + steps.Update, + steps.ApplyPatch, + steps.Build, + steps.RunTests, + ] + + class PostAttachmentToRietveld(AbstractPatchSequencingCommand, ProcessAttachmentsMixin): name = "post-attachment-to-rietveld" help_text = "Uploads a bugzilla attachment to rietveld" diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py index 1f04923..3b0ea47 100644 --- a/WebKitTools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py +++ b/WebKitTools/Scripts/webkitpy/tool/commands/earlywarningsystem_unittest.py @@ -42,16 +42,15 @@ class EarlyWarningSytemTest(QueuesTest): def _default_expected_stderr(self, ews): string_replacemnts = { "name": ews.name, - "checkout_dir": os.getcwd(), # FIXME: Use of os.getcwd() is wrong, should be scm.checkout_root "port": ews.port_name, "watchers": ews.watchers, } expected_stderr = { - "begin_work_queue": "CAUTION: %(name)s will discard all local changes in \"%(checkout_dir)s\"\nRunning WebKit %(name)s.\n" % string_replacemnts, + "begin_work_queue": self._default_begin_work_queue_stderr(ews.name, os.getcwd()), # FIXME: Use of os.getcwd() is wrong, should be scm.checkout_root "handle_unexpected_error": "Mock error message\n", "next_work_item": "MOCK: update_work_items: %(name)s [103]\n" % string_replacemnts, "process_work_item": "MOCK: update_status: %(name)s Pass\n" % string_replacemnts, - "handle_script_error": "MOCK: update_status: %(name)s ScriptError error message\nMOCK bug comment: bug_id=345, cc=%(watchers)s\n--- Begin comment ---\\Attachment 1234 did not build on %(port)s:\nBuild output: http://dummy_url\n--- End comment ---\n\n" % string_replacemnts, + "handle_script_error": "MOCK: update_status: %(name)s ScriptError error message\nMOCK bug comment: bug_id=142, cc=%(watchers)s\n--- Begin comment ---\\Attachment 197 did not build on %(port)s:\nBuild output: http://dummy_url\n--- End comment ---\n\n" % string_replacemnts, } return expected_stderr diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/queues.py b/WebKitTools/Scripts/webkitpy/tool/commands/queues.py index 4d2a9df..bc9ee42 100644 --- a/WebKitTools/Scripts/webkitpy/tool/commands/queues.py +++ b/WebKitTools/Scripts/webkitpy/tool/commands/queues.py @@ -95,6 +95,10 @@ class AbstractQueue(Command, QueueEngineDelegate): if (response != "yes"): error("User declined.") log("Running WebKit %s." % self.name) + self.tool.status_server.update_status(self.name, "Starting Queue") + + def stop_work_queue(self, reason): + self.tool.status_server.update_status(self.name, "Stopping Queue, reason: %s" % reason) def should_continue_work_queue(self): self._iteration_count += 1 @@ -115,8 +119,8 @@ class AbstractQueue(Command, QueueEngineDelegate): # Command methods def execute(self, options, args, tool, engine=QueueEngine): - self.options = options - self.tool = tool + self.options = options # FIXME: This code is wrong. Command.options is a list, this assumes an Options element! + self.tool = tool # FIXME: This code is wrong too! Command.bind_to_tool handles this! return engine(self.name, self, self.tool.wakeup_event).run() @classmethod @@ -144,8 +148,16 @@ class AbstractPatchQueue(AbstractQueue): def _update_status(self, message, patch=None, results_file=None): self.tool.status_server.update_status(self.name, message, patch, results_file) + # Note, eventually this will be done by a separate "feeder" queue + # whose job it is to poll bugzilla and feed work items into the + # status server for other queues to munch on. def _update_work_items(self, patch_ids): self.tool.status_server.update_work_items(self.name, patch_ids) + if patch_ids: + self.log_progress(patch_ids) + + def _fetch_next_work_item(self): + return self.tool.status_server.next_work_item(self.name) def _did_pass(self, patch): self._update_status(self._pass_status, patch) @@ -189,18 +201,22 @@ class CommitQueue(AbstractPatchQueue, StepSequenceErrorHandler): return rollout_cmp return cmp(a.attach_date(), b.attach_date()) - def next_work_item(self): + def _feed_work_items_to_server(self): + # Grab the set of patches from bugzilla, sort them, and update the status server. + # Eventually this will all be done by a separate feeder queue. patches = self._validate_patches_in_commit_queue() patches = sorted(patches, self._patch_cmp) self._update_work_items([patch.id() for patch in patches]) - if not patches: - self._update_status("Empty queue") + + def next_work_item(self): + self._feed_work_items_to_server() + # The grab the next patch to work on back from the status server. + patch_id = self._fetch_next_work_item() + if not patch_id: return None - # Only bother logging if we have patches in the queue. - self.log_progress([patch.id() for patch in patches]) - return patches[0] + return self.tool.bugs.fetch_attachment(patch_id) - def _can_build_and_test(self): + def _can_build_and_test_without_patch(self): try: self.run_webkit_patch([ "build-and-test", @@ -211,25 +227,24 @@ class CommitQueue(AbstractPatchQueue, StepSequenceErrorHandler): "--no-update", "--build-style=both", "--quiet"]) + return True except ScriptError, e: failure_log = self._log_from_script_error_for_upload(e) - self._update_status("Unable to successfully build and test", results_file=failure_log) + self._update_status("Unable to build and test without patch", results_file=failure_log) return False - return True def should_proceed_with_work_item(self, patch): patch_text = "rollout patch" if patch.is_rollout() else "patch" self._update_status("Landing %s" % patch_text, patch) return True - def _land(self, patch, first_run=False): + def _build_and_test_patch(self, patch, first_run=False): try: args = [ - "land-attachment", + "build-and-test-attachment", "--force-clean", "--build", "--non-interactive", - "--ignore-builders", "--build-style=both", "--quiet", patch.id() @@ -249,27 +264,68 @@ class CommitQueue(AbstractPatchQueue, StepSequenceErrorHandler): # built and tested. args.append("--no-update") self.run_webkit_patch(args) - self._did_pass(patch) return True except ScriptError, e: + failure_log = self._log_from_script_error_for_upload(e) + self._update_status("Unable to build and test patch", patch=patch, results_file=failure_log) if first_run: return False self._did_fail(patch) raise + def _revalidate_patch(self, patch): + # Bugs might get closed, or patches might be obsoleted or r-'d while the + # commit-queue is processing. Do one last minute check before landing. + patch = self.tool.bugs.fetch_attachment(patch.id()) + if patch.is_obsolete(): + return None + if patch.bug().is_closed(): + return None + if not patch.committer(): + return None + # Reviewer is not required. Misisng reviewers will be caught during the ChangeLog check during landing. + return patch + + def _land(self, patch): + try: + args = [ + "land-attachment", + "--force-clean", + "--non-interactive", + "--ignore-builders", + "--quiet", + "--parent-command=commit-queue", + patch.id(), + ] + self.run_webkit_patch(args) + self._did_pass(patch) + except ScriptError, e: + failure_log = self._log_from_script_error_for_upload(e) + self._update_status("Unable to land patch", patch=patch, results_file=failure_log) + self._did_fail(patch) + raise + def process_work_item(self, patch): self._cc_watchers(patch.bug_id()) - if not self._land(patch, first_run=True): - # The patch failed to land, but the bots were green. It's possible - # that the bots were behind. To check that case, we try to build and - # test ourselves. - if not self._can_build_and_test(): + if not self._build_and_test_patch(patch, first_run=True): + self._update_status("Building and testing without the patch as a sanity check", patch) + # The patch failed to build and test. It's possible that the + # tree is busted. To check that case, we try to build and test + # without the patch. + if not self._can_build_and_test_without_patch(): return False + self._update_status("Build and test succeeded, trying again with patch", patch) # Hum, looks like the patch is actually bad. Of course, we could # have been bitten by a flaky test the first time around. We try - # to land again. If it fails a second time, we're pretty sure its - # a bad test and re can reject it outright. - self._land(patch) + # to build and test again. If it fails a second time, we're pretty + # sure its a bad test and re can reject it outright. + self._build_and_test_patch(patch) + # Do one last check to catch any bug changes (cq-, closed, reviewer changed, etc.) + # This helps catch races between the bots if locks expire. + patch = self._revalidate_patch(patch) + if not patch: + return False + self._land(patch) return True def handle_unexpected_error(self, patch, message): @@ -291,6 +347,8 @@ class CommitQueue(AbstractPatchQueue, StepSequenceErrorHandler): @classmethod def handle_checkout_needs_update(cls, tool, state, options, error): + message = "Tests passed, but commit failed (checkout out of date). Updating, then landing without building or re-running tests." + tool.status_server.update_status(cls.name, message, state["patch"]) # The only time when we find out that out checkout needs update is # when we were ready to actually pull the trigger and land the patch. # Rather than spinning in the master process, we retry without @@ -377,7 +435,6 @@ class AbstractReviewQueue(AbstractPatchQueue, PersistentPatchCollectionDelegate, patch_id = self._patches.next() if patch_id: return self.tool.bugs.fetch_attachment(patch_id) - self._update_status("Empty queue") def should_proceed_with_work_item(self, patch): raise NotImplementedError, "subclasses must implement" diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py index fd6543c..2deee76 100644 --- a/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py +++ b/WebKitTools/Scripts/webkitpy/tool/commands/queues_unittest.py @@ -34,9 +34,9 @@ from webkitpy.common.system.outputcapture import OutputCapture from webkitpy.thirdparty.mock import Mock from webkitpy.tool.commands.commandtest import CommandsTest from webkitpy.tool.commands.queues import * -from webkitpy.tool.commands.queuestest import QueuesTest +from webkitpy.tool.commands.queuestest import QueuesTest, MockPatch from webkitpy.tool.commands.stepsequence import StepSequence -from webkitpy.tool.mocktool import MockTool, MockSCM +from webkitpy.tool.mocktool import MockTool, MockSCM, MockStatusServer class TestQueue(AbstractPatchQueue): @@ -47,16 +47,10 @@ class TestReviewQueue(AbstractReviewQueue): name = "test-review-queue" -class MockPatch(object): +class MockRolloutPatch(MockPatch): def is_rollout(self): return True - def bug_id(self): - return 12345 - - def id(self): - return 76543 - class AbstractQueueTest(CommandsTest): def _assert_log_progress_output(self, patch_ids, progress_output): @@ -121,6 +115,16 @@ class AbstractQueueTest(CommandsTest): self._assert_log_message(script_error, expected_output) +class AbstractPatchQueueTest(CommandsTest): + def test_fetch_next_work_item(self): + queue = AbstractPatchQueue() + tool = MockTool() + queue.bind_to_tool(tool) + self.assertEquals(queue._fetch_next_work_item(), None) + tool.status_server = MockStatusServer(work_items=[2, 1, 3]) + self.assertEquals(queue._fetch_next_work_item(), 2) + + class AbstractReviewQueueTest(CommandsTest): def test_patch_collection_delegate_methods(self): queue = TestReviewQueue() @@ -141,25 +145,47 @@ class NeedsUpdateSequence(StepSequence): class AlwaysCommitQueueTool(object): + def __init__(self): + self.status_server = MockStatusServer() + def command_by_name(self, name): return CommitQueue +class SecondThoughtsCommitQueue(CommitQueue): + def _build_and_test_patch(self, patch, first_run=True): + attachment_dictionary = { + "id": patch.id(), + "bug_id": patch.bug_id(), + "name": "Rejected", + "is_obsolete": True, + "is_patch": False, + "review": "-", + "reviewer_email": "foo@bar.com", + "commit-queue": "-", + "committer_email": "foo@bar.com", + "attacher_email": "Contributer1", + } + patch = Attachment(attachment_dictionary, None) + self.tool.bugs.set_override_patch(patch) + return True + + class CommitQueueTest(QueuesTest): def test_commit_queue(self): expected_stderr = { - "begin_work_queue" : "CAUTION: commit-queue will discard all local changes in \"%s\"\nRunning WebKit commit-queue.\n" % MockSCM.fake_checkout_root, + "begin_work_queue": self._default_begin_work_queue_stderr("commit-queue", MockSCM.fake_checkout_root), "should_proceed_with_work_item": "MOCK: update_status: commit-queue Landing patch\n", # FIXME: The commit-queue warns about bad committers twice. This is due to the fact that we access Attachment.reviewer() twice and it logs each time. - "next_work_item" : """Warning, attachment 128 on bug 42 has invalid committer (non-committer@example.com) + "next_work_item": """Warning, attachment 128 on bug 42 has invalid committer (non-committer@example.com) Warning, attachment 128 on bug 42 has invalid committer (non-committer@example.com) MOCK setting flag 'commit-queue' to '-' on attachment '128' with comment 'Rejecting patch 128 from commit-queue.' and additional comment 'non-committer@example.com does not have committer permissions according to http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/common/config/committers.py.\n\n- If you do not have committer rights please read http://webkit.org/coding/contributing.html for instructions on how to use bugzilla flags.\n\n- If you have committer rights please correct the error in WebKitTools/Scripts/webkitpy/common/config/committers.py by adding yourself to the file (no review needed). The commit-queue restarts itself every 2 hours. After restart the commit-queue will correctly respect your committer rights.' MOCK: update_work_items: commit-queue [106, 197] 2 patches in commit-queue [106, 197] """, - "process_work_item" : "MOCK: update_status: commit-queue Pass\n", - "handle_unexpected_error" : "MOCK setting flag 'commit-queue' to '-' on attachment '1234' with comment 'Rejecting patch 1234 from commit-queue.' and additional comment 'Mock error message'\n", - "handle_script_error": "MOCK: update_status: commit-queue ScriptError error message\nMOCK setting flag 'commit-queue' to '-' on attachment '1234' with comment 'Rejecting patch 1234 from commit-queue.' and additional comment 'ScriptError error message'\n", + "process_work_item": "MOCK: update_status: commit-queue Pass\n", + "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '197' with comment 'Rejecting patch 197 from commit-queue.' and additional comment 'Mock error message'\n", + "handle_script_error": "MOCK: update_status: commit-queue ScriptError error message\nMOCK setting flag 'commit-queue' to '-' on attachment '197' with comment 'Rejecting patch 197 from commit-queue.' and additional comment 'ScriptError error message'\n", } self.assert_queue_outputs(CommitQueue(), expected_stderr=expected_stderr) @@ -167,10 +193,10 @@ MOCK: update_work_items: commit-queue [106, 197] tool = MockTool(log_executive=True) tool.buildbot.light_tree_on_fire() expected_stderr = { - "begin_work_queue" : "CAUTION: commit-queue will discard all local changes in \"%s\"\nRunning WebKit commit-queue.\n" % MockSCM.fake_checkout_root, + "begin_work_queue": self._default_begin_work_queue_stderr("commit-queue", MockSCM.fake_checkout_root), "should_proceed_with_work_item": "MOCK: update_status: commit-queue Landing patch\n", # FIXME: The commit-queue warns about bad committers twice. This is due to the fact that we access Attachment.reviewer() twice and it logs each time. - "next_work_item" : """Warning, attachment 128 on bug 42 has invalid committer (non-committer@example.com) + "next_work_item": """Warning, attachment 128 on bug 42 has invalid committer (non-committer@example.com) Warning, attachment 128 on bug 42 has invalid committer (non-committer@example.com) MOCK setting flag 'commit-queue' to '-' on attachment '128' with comment 'Rejecting patch 128 from commit-queue.' and additional comment 'non-committer@example.com does not have committer permissions according to http://trac.webkit.org/browser/trunk/WebKitTools/Scripts/webkitpy/common/config/committers.py. @@ -180,18 +206,18 @@ MOCK setting flag 'commit-queue' to '-' on attachment '128' with comment 'Reject MOCK: update_work_items: commit-queue [106, 197] 2 patches in commit-queue [106, 197] """, - "process_work_item" : "MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'land-attachment', '--force-clean', '--build', '--non-interactive', '--ignore-builders', '--build-style=both', '--quiet', 1234, '--test']\nMOCK: update_status: commit-queue Pass\n", - "handle_unexpected_error" : "MOCK setting flag 'commit-queue' to '-' on attachment '1234' with comment 'Rejecting patch 1234 from commit-queue.' and additional comment 'Mock error message'\n", - "handle_script_error": "MOCK: update_status: commit-queue ScriptError error message\nMOCK setting flag 'commit-queue' to '-' on attachment '1234' with comment 'Rejecting patch 1234 from commit-queue.' and additional comment 'ScriptError error message'\n", + "process_work_item": "MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'build-and-test-attachment', '--force-clean', '--build', '--non-interactive', '--build-style=both', '--quiet', 197, '--test']\nMOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'land-attachment', '--force-clean', '--non-interactive', '--ignore-builders', '--quiet', '--parent-command=commit-queue', 197]\nMOCK: update_status: commit-queue Pass\n", + "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '197' with comment 'Rejecting patch 197 from commit-queue.' and additional comment 'Mock error message'\n", + "handle_script_error": "MOCK: update_status: commit-queue ScriptError error message\nMOCK setting flag 'commit-queue' to '-' on attachment '197' with comment 'Rejecting patch 197 from commit-queue.' and additional comment 'ScriptError error message'\n", } self.assert_queue_outputs(CommitQueue(), tool=tool, expected_stderr=expected_stderr) def test_rollout_lands(self): tool = MockTool(log_executive=True) tool.buildbot.light_tree_on_fire() - rollout_patch = MockPatch() + rollout_patch = MockRolloutPatch() expected_stderr = { - "begin_work_queue": "CAUTION: commit-queue will discard all local changes in \"%s\"\nRunning WebKit commit-queue.\n" % MockSCM.fake_checkout_root, + "begin_work_queue": self._default_begin_work_queue_stderr("commit-queue", MockSCM.fake_checkout_root), "should_proceed_with_work_item": "MOCK: update_status: commit-queue Landing rollout patch\n", # FIXME: The commit-queue warns about bad committers twice. This is due to the fact that we access Attachment.reviewer() twice and it logs each time. "next_work_item": """Warning, attachment 128 on bug 42 has invalid committer (non-committer@example.com) @@ -204,9 +230,9 @@ MOCK setting flag 'commit-queue' to '-' on attachment '128' with comment 'Reject MOCK: update_work_items: commit-queue [106, 197] 2 patches in commit-queue [106, 197] """, - "process_work_item": "MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'land-attachment', '--force-clean', '--build', '--non-interactive', '--ignore-builders', '--build-style=both', '--quiet', 76543]\nMOCK: update_status: commit-queue Pass\n", - "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '76543' with comment 'Rejecting patch 76543 from commit-queue.' and additional comment 'Mock error message'\n", - "handle_script_error": "MOCK: update_status: commit-queue ScriptError error message\nMOCK setting flag 'commit-queue' to '-' on attachment '1234' with comment 'Rejecting patch 1234 from commit-queue.' and additional comment 'ScriptError error message'\n", + "process_work_item": "MOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'build-and-test-attachment', '--force-clean', '--build', '--non-interactive', '--build-style=both', '--quiet', 197]\nMOCK run_and_throw_if_fail: ['echo', '--status-host=example.com', 'land-attachment', '--force-clean', '--non-interactive', '--ignore-builders', '--quiet', '--parent-command=commit-queue', 197]\nMOCK: update_status: commit-queue Pass\n", + "handle_unexpected_error": "MOCK setting flag 'commit-queue' to '-' on attachment '197' with comment 'Rejecting patch 197 from commit-queue.' and additional comment 'Mock error message'\n", + "handle_script_error": "MOCK: update_status: commit-queue ScriptError error message\nMOCK setting flag 'commit-queue' to '-' on attachment '197' with comment 'Rejecting patch 197 from commit-queue.' and additional comment 'ScriptError error message'\n", } self.assert_queue_outputs(CommitQueue(), tool=tool, work_item=rollout_patch, expected_stderr=expected_stderr) @@ -215,7 +241,7 @@ MOCK: update_work_items: commit-queue [106, 197] tool = MockTool() tool.executive = Mock() queue.bind_to_tool(tool) - self.assertTrue(queue._can_build_and_test()) + self.assertTrue(queue._can_build_and_test_without_patch()) expected_run_args = ["echo", "--status-host=example.com", "build-and-test", "--force-clean", "--build", "--test", "--non-interactive", "--no-update", "--build-style=both", "--quiet"] tool.executive.run_and_throw_if_fail.assert_called_with(expected_run_args) @@ -245,22 +271,28 @@ MOCK: update_work_items: commit-queue [106, 197] tool = AlwaysCommitQueueTool() sequence = NeedsUpdateSequence(None) - expected_stderr = "Commit failed because the checkout is out of date. Please update and try again.\n" - OutputCapture().assert_outputs(self, sequence.run_and_handle_errors, [tool, options], expected_exception=TryAgain, expected_stderr=expected_stderr) + expected_stderr = "Commit failed because the checkout is out of date. Please update and try again.\nMOCK: update_status: commit-queue Tests passed, but commit failed (checkout out of date). Updating, then landing without building or re-running tests.\n" + state = {'patch': None} + OutputCapture().assert_outputs(self, sequence.run_and_handle_errors, [tool, options, state], expected_exception=TryAgain, expected_stderr=expected_stderr) self.assertEquals(options.update, True) self.assertEquals(options.build, False) self.assertEquals(options.test, False) + def test_manual_reject_during_processing(self): + queue = SecondThoughtsCommitQueue() + queue.bind_to_tool(MockTool()) + queue.process_work_item(MockPatch()) + class RietveldUploadQueueTest(QueuesTest): def test_rietveld_upload_queue(self): expected_stderr = { - "begin_work_queue": "CAUTION: rietveld-upload-queue will discard all local changes in \"%s\"\nRunning WebKit rietveld-upload-queue.\n" % MockSCM.fake_checkout_root, + "begin_work_queue": self._default_begin_work_queue_stderr("rietveld-upload-queue", MockSCM.fake_checkout_root), "should_proceed_with_work_item": "MOCK: update_status: rietveld-upload-queue Uploading patch\n", "process_work_item": "MOCK: update_status: rietveld-upload-queue Pass\n", - "handle_unexpected_error": "Mock error message\nMOCK setting flag 'in-rietveld' to '-' on attachment '1234' with comment 'None' and additional comment 'None'\n", - "handle_script_error": "ScriptError error message\nMOCK: update_status: rietveld-upload-queue ScriptError error message\nMOCK setting flag 'in-rietveld' to '-' on attachment '1234' with comment 'None' and additional comment 'None'\n", + "handle_unexpected_error": "Mock error message\nMOCK setting flag 'in-rietveld' to '-' on attachment '197' with comment 'None' and additional comment 'None'\n", + "handle_script_error": "ScriptError error message\nMOCK: update_status: rietveld-upload-queue ScriptError error message\nMOCK setting flag 'in-rietveld' to '-' on attachment '197' with comment 'None' and additional comment 'None'\n", } self.assert_queue_outputs(RietveldUploadQueue(), expected_stderr=expected_stderr) @@ -268,12 +300,12 @@ class RietveldUploadQueueTest(QueuesTest): class StyleQueueTest(QueuesTest): def test_style_queue(self): expected_stderr = { - "begin_work_queue" : "CAUTION: style-queue will discard all local changes in \"%s\"\nRunning WebKit style-queue.\n" % MockSCM.fake_checkout_root, + "begin_work_queue": self._default_begin_work_queue_stderr("style-queue", MockSCM.fake_checkout_root), "next_work_item": "MOCK: update_work_items: style-queue [103]\n", "should_proceed_with_work_item": "MOCK: update_status: style-queue Checking style\n", - "process_work_item" : "MOCK: update_status: style-queue Pass\n", - "handle_unexpected_error" : "Mock error message\n", - "handle_script_error": "MOCK: update_status: style-queue ScriptError error message\nMOCK bug comment: bug_id=345, cc=[]\n--- Begin comment ---\\Attachment 1234 did not pass style-queue:\n\nScriptError error message\n\nIf any of these errors are false positives, please file a bug against check-webkit-style.\n--- End comment ---\n\n", + "process_work_item": "MOCK: update_status: style-queue Pass\n", + "handle_unexpected_error": "Mock error message\n", + "handle_script_error": "MOCK: update_status: style-queue ScriptError error message\nMOCK bug comment: bug_id=142, cc=[]\n--- Begin comment ---\\Attachment 197 did not pass style-queue:\n\nScriptError error message\n\nIf any of these errors are false positives, please file a bug against check-webkit-style.\n--- End comment ---\n\n", } expected_exceptions = { "handle_script_error": SystemExit, diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/queuestest.py b/WebKitTools/Scripts/webkitpy/tool/commands/queuestest.py index 9e17c5c..aa3cef4 100644 --- a/WebKitTools/Scripts/webkitpy/tool/commands/queuestest.py +++ b/WebKitTools/Scripts/webkitpy/tool/commands/queuestest.py @@ -45,16 +45,20 @@ class MockQueueEngine(object): class MockPatch(): def id(self): - return 1234 + return 197 def bug_id(self): - return 345 + return 142 + + def is_rollout(self): + return False class QueuesTest(unittest.TestCase): + # Ids match patch1 in mocktool.py mock_work_item = Attachment({ - "id": 1234, - "bug_id": 345, + "id": 197, + "bug_id": 142, "name": "Patch", "attacher_email": "adam@example.com", }, None) @@ -71,6 +75,10 @@ class QueuesTest(unittest.TestCase): expected_stderr=expected_stderr.get(func_name, ""), expected_exception=exception) + def _default_begin_work_queue_stderr(self, name, checkout_dir): + string_replacements = {"name": name, 'checkout_dir': checkout_dir} + return "CAUTION: %(name)s will discard all local changes in \"%(checkout_dir)s\"\nRunning WebKit %(name)s.\nMOCK: update_status: %(name)s Starting Queue\n" % string_replacements + def assert_queue_outputs(self, queue, args=None, work_item=None, expected_stdout=None, expected_stderr=None, expected_exceptions=None, options=Mock(), tool=MockTool()): if not expected_stdout: expected_stdout = {} diff --git a/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py b/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py index 4b4b8b6..a63ec24 100644 --- a/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py +++ b/WebKitTools/Scripts/webkitpy/tool/commands/sheriffbot_unittest.py @@ -42,7 +42,7 @@ class SheriffBotTest(QueuesTest): 29837: [self.builder1], } expected_stderr = { - "begin_work_queue": "CAUTION: sheriff-bot will discard all local changes in \"%s\"\nRunning WebKit sheriff-bot.\n" % os.getcwd(), + "begin_work_queue": self._default_begin_work_queue_stderr("sheriff-bot", os.getcwd()), "next_work_item": "", "process_work_item": "MOCK: irc.post: abarth, darin, eseidel: http://trac.webkit.org/changeset/29837 might have broken Builder1\nMOCK bug comment: bug_id=42, cc=['abarth@webkit.org', 'eric@webkit.org']\n--- Begin comment ---\\http://trac.webkit.org/changeset/29837 might have broken Builder1\n--- End comment ---\n\n", "handle_unexpected_error": "Mock error message\n" diff --git a/WebKitTools/Scripts/webkitpy/tool/mocktool.py b/WebKitTools/Scripts/webkitpy/tool/mocktool.py index e3d36ce..8a6188a 100644 --- a/WebKitTools/Scripts/webkitpy/tool/mocktool.py +++ b/WebKitTools/Scripts/webkitpy/tool/mocktool.py @@ -161,6 +161,7 @@ _bug1 = { "invalid commit-queue setter.", "assigned_to_email": _unassigned_email, "attachments": [_patch1, _patch2], + "bug_status": "UNCONFIRMED", } @@ -169,6 +170,7 @@ _bug2 = { "title": "Bug with a patch needing review.", "assigned_to_email": "foo@foo.com", "attachments": [_patch3], + "bug_status": "ASSIGNED", } @@ -177,6 +179,7 @@ _bug3 = { "title": "The third bug", "assigned_to_email": _unassigned_email, "attachments": [_patch7], + "bug_status": "NEW", } @@ -185,6 +188,7 @@ _bug4 = { "title": "The fourth bug", "assigned_to_email": "foo@foo.com", "attachments": [_patch4, _patch5, _patch6], + "bug_status": "REOPENED", } @@ -254,8 +258,8 @@ class MockBugzilla(Mock): def __init__(self): Mock.__init__(self) self.queries = MockBugzillaQueries(self) - self.committers = CommitterList(reviewers=[Reviewer("Foo Bar", - "foo@bar.com")]) + self.committers = CommitterList(reviewers=[Reviewer("Foo Bar", "foo@bar.com")]) + self._override_patch = None def create_bug(self, bug_title, @@ -277,7 +281,13 @@ class MockBugzilla(Mock): def fetch_bug(self, bug_id): return Bug(self.bug_cache.get(bug_id), self) + def set_override_patch(self, patch): + self._override_patch = patch + def fetch_attachment(self, attachment_id): + if self._override_patch: + return self._override_patch + # This could be changed to .get() if we wish to allow failed lookups. attachment_dictionary = self.attachment_cache[attachment_id] bug = self.fetch_bug(attachment_dictionary["bug_id"]) @@ -497,8 +507,9 @@ class MockIRC(object): class MockStatusServer(object): - def __init__(self): + def __init__(self, work_items=None): self.host = "example.com" + self._work_items = work_items or [] def patch_status(self, queue_name, patch_id): return None @@ -506,7 +517,13 @@ class MockStatusServer(object): def svn_revision(self, svn_revision): return None + def next_work_item(self, queue_name): + if not self._work_items: + return None + return self._work_items[0] + def update_work_items(self, queue_name, work_items): + self._work_items = work_items log("MOCK: update_work_items: %s %s" % (queue_name, work_items)) def update_status(self, queue_name, status, patch=None, results_file=None): diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/applypatch.py b/WebKitTools/Scripts/webkitpy/tool/steps/applypatch.py index 6cded27..327ac09 100644 --- a/WebKitTools/Scripts/webkitpy/tool/steps/applypatch.py +++ b/WebKitTools/Scripts/webkitpy/tool/steps/applypatch.py @@ -35,8 +35,9 @@ class ApplyPatch(AbstractStep): def options(cls): return AbstractStep.options() + [ Options.non_interactive, + Options.force_patch, ] def run(self, state): log("Processing patch %s from bug %s." % (state["patch"].id(), state["patch"].bug_id())) - self._tool.checkout().apply_patch(state["patch"], force=self._options.non_interactive) + self._tool.checkout().apply_patch(state["patch"], force=self._options.non_interactive or self._options.force_patch) diff --git a/WebKitTools/Scripts/webkitpy/tool/steps/options.py b/WebKitTools/Scripts/webkitpy/tool/steps/options.py index e7e3855..3dc1963 100644 --- a/WebKitTools/Scripts/webkitpy/tool/steps/options.py +++ b/WebKitTools/Scripts/webkitpy/tool/steps/options.py @@ -43,6 +43,7 @@ class Options(object): description = make_option("-m", "--description", action="store", type="string", dest="description", help="Description string for the attachment (default: \"patch\")") email = make_option("--email", action="store", type="string", dest="email", help="Email address to use in ChangeLogs.") force_clean = make_option("--force-clean", action="store_true", dest="force_clean", default=False, help="Clean working directory before applying patches (removes local changes and commits)") + force_patch = make_option("--force-patch", action="store_true", dest="force_patch", default=False, help="Forcefully applies the patch, continuing past errors.") git_commit = make_option("-g", "--git-commit", action="store", dest="git_commit", help="Operate on a local commit. If a range, the commits are squashed into one. HEAD.. operates on working copy changes only.") local_commit = make_option("--local-commit", action="store_true", dest="local_commit", default=False, help="Make a local commit for each applied patch") non_interactive = make_option("--non-interactive", action="store_true", dest="non_interactive", default=False, help="Never prompt the user, fail as fast as possible.") diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp b/WebKitTools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp index 472cf6c..73de45b 100644 --- a/WebKitTools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp +++ b/WebKitTools/WebKitTestRunner/InjectedBundle/EventSendingController.cpp @@ -92,30 +92,38 @@ void EventSendingController::leapForward(JSContextRef context, size_t argumentCo void EventSendingController::textZoomIn() { - WKBundlePageSetZoomMode(InjectedBundle::shared().page()->page(), kWKBundlePageZoomModeTextOnly); - float zoomFactor = WKBundlePageGetZoomFactor(InjectedBundle::shared().page()->page()); - WKBundlePageSetZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor * ZoomMultiplierRatio); + // Ensure page zoom is reset. + WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), 1); + + double zoomFactor = WKBundlePageGetTextZoomFactor(InjectedBundle::shared().page()->page()); + WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor * ZoomMultiplierRatio); } void EventSendingController::textZoomOut() { - WKBundlePageSetZoomMode(InjectedBundle::shared().page()->page(), kWKBundlePageZoomModeTextOnly); - float zoomFactor = WKBundlePageGetZoomFactor(InjectedBundle::shared().page()->page()); - WKBundlePageSetZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor / ZoomMultiplierRatio); + // Ensure page zoom is reset. + WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), 1); + + double zoomFactor = WKBundlePageGetTextZoomFactor(InjectedBundle::shared().page()->page()); + WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor / ZoomMultiplierRatio); } void EventSendingController::zoomPageIn() { - WKBundlePageSetZoomMode(InjectedBundle::shared().page()->page(), kWKBundlePageZoomModePage); - float zoomFactor = WKBundlePageGetZoomFactor(InjectedBundle::shared().page()->page()); - WKBundlePageSetZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor * ZoomMultiplierRatio); + // Ensure text zoom is reset. + WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), 1); + + double zoomFactor = WKBundlePageGetPageZoomFactor(InjectedBundle::shared().page()->page()); + WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor * ZoomMultiplierRatio); } void EventSendingController::zoomPageOut() { - WKBundlePageSetZoomMode(InjectedBundle::shared().page()->page(), kWKBundlePageZoomModePage); - float zoomFactor = WKBundlePageGetZoomFactor(InjectedBundle::shared().page()->page()); - WKBundlePageSetZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor / ZoomMultiplierRatio); + // Ensure text zoom is reset. + WKBundlePageSetTextZoomFactor(InjectedBundle::shared().page()->page(), 1); + + double zoomFactor = WKBundlePageGetPageZoomFactor(InjectedBundle::shared().page()->page()); + WKBundlePageSetPageZoomFactor(InjectedBundle::shared().page()->page(), zoomFactor / ZoomMultiplierRatio); } // Object Creation diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp b/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp index bf7a029..dd92eca 100644 --- a/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp +++ b/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.cpp @@ -31,54 +31,97 @@ #include <WebKit2/WKArray.h> #include <WebKit2/WKBundleFrame.h> #include <WebKit2/WKBundleFramePrivate.h> -#include <WebKit2/WKBundleNode.h> #include <WebKit2/WKBundlePagePrivate.h> -#include <WebKit2/WKRetainPtr.h> -#include <WebKit2/WKBundleRange.h> -#include <WebKit2/WKBundleScriptWorld.h> using namespace std; namespace WTR { -static ostream& operator<<(ostream& out, WKBundleFrameRef frame) +static JSValueRef propertyValue(JSContextRef context, JSObjectRef object, const char* propertyName) { - WKRetainPtr<WKStringRef> name(AdoptWK, WKBundleFrameCopyName(frame)); - if (WKBundleFrameIsMainFrame(frame)) { - if (!WKStringIsEmpty(name.get())) - out << "main frame \"" << name << "\""; - else - out << "main frame"; - } else { - if (!WKStringIsEmpty(name.get())) - out << "frame \"" << name << "\""; - else - out << "frame (anonymous)"; - } + if (!object) + return 0; + JSRetainPtr<JSStringRef> propertyNameString(Adopt, JSStringCreateWithUTF8CString(propertyName)); + return JSObjectGetProperty(context, object, propertyNameString.get(), 0); +} - return out; +static double propertyValueDouble(JSContextRef context, JSObjectRef object, const char* propertyName) +{ + JSValueRef value = propertyValue(context, object, propertyName); + if (!value) + return 0; + return JSValueToNumber(context, value, 0); } -static string dumpPath(WKBundleNodeRef node) +static int propertyValueInt(JSContextRef context, JSObjectRef object, const char* propertyName) { - if (!node) - return "(null)"; - WKRetainPtr<WKStringRef> nodeName(AdoptWK, WKBundleNodeCopyNodeName(node)); + return static_cast<int>(propertyValueDouble(context, object, propertyName)); +} + +static double numericWindowPropertyValue(WKBundleFrameRef frame, const char* propertyName) +{ + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContext(frame); + return propertyValueDouble(context, JSContextGetGlobalObject(context), propertyName); +} + +static string dumpPath(JSGlobalContextRef context, JSObjectRef nodeValue) +{ + JSValueRef nodeNameValue = propertyValue(context, nodeValue, "nodeName"); + JSRetainPtr<JSStringRef> jsStringNodeName(Adopt, JSValueToStringCopy(context, nodeNameValue, 0)); + WKRetainPtr<WKStringRef> nodeName = toWK(jsStringNodeName); + + JSValueRef parentNode = propertyValue(context, nodeValue, "parentNode"); + ostringstream out; out << nodeName; - if (WKBundleNodeRef parent = WKBundleNodeGetParent(node)) - out << " > " << dumpPath(parent); + + if (parentNode && JSValueIsObject(context, parentNode)) + out << " > " << dumpPath(context, (JSObjectRef)parentNode); + return out.str(); } -static ostream& operator<<(ostream& out, WKBundleRangeRef rangeRef) +static string dumpPath(WKBundlePageRef page, WKBundleScriptWorldRef world, WKBundleNodeHandleRef node) { - if (rangeRef) - out << "range from " << WKBundleRangeGetStartOffset(rangeRef) << " of " << dumpPath(WKBundleRangeGetStartContainer(rangeRef)) << " to " << WKBundleRangeGetEndOffset(rangeRef) << " of " << dumpPath(WKBundleRangeGetEndContainer(rangeRef)); - else - out << "(null)"; + if (!node) + return "(null)"; - return out; + WKBundleFrameRef frame = WKBundlePageGetMainFrame(page); + + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContextForWorld(frame, world); + JSValueRef nodeValue = WKBundleFrameGetJavaScriptWrapperForNodeForWorld(frame, node, world); + ASSERT(JSValueIsObject(context, nodeValue)); + JSObjectRef nodeObject = (JSObjectRef)nodeValue; + + return dumpPath(context, nodeObject); +} + +static string toStr(WKBundlePageRef page, WKBundleScriptWorldRef world, WKBundleRangeHandleRef rangeRef) +{ + if (!rangeRef) + return "(null)"; + + WKBundleFrameRef frame = WKBundlePageGetMainFrame(page); + + JSGlobalContextRef context = WKBundleFrameGetJavaScriptContextForWorld(frame, world); + JSValueRef rangeValue = WKBundleFrameGetJavaScriptWrapperForRangeForWorld(frame, rangeRef, world); + ASSERT(JSValueIsObject(context, rangeValue)); + JSObjectRef rangeObject = (JSObjectRef)rangeValue; + + JSValueRef startNodeValue = propertyValue(context, rangeObject, "startContainer"); + ASSERT(JSValueIsObject(context, startNodeValue)); + JSObjectRef startNodeObject = (JSObjectRef)startNodeValue; + + JSValueRef endNodeValue = propertyValue(context, rangeObject, "endContainer"); + ASSERT(JSValueIsObject(context, endNodeValue)); + JSObjectRef endNodeObject = (JSObjectRef)endNodeValue; + + int startOffset = propertyValueInt(context, rangeObject, "startOffset"); + int endOffset = propertyValueInt(context, rangeObject, "endOffset"); + + ostringstream out; + out << "range from " << startOffset << " of " << dumpPath(context, startNodeObject) << " to " << endOffset << " of " << dumpPath(context, endNodeObject); + return out.str(); } static ostream& operator<<(ostream& out, WKBundleCSSStyleDeclarationRef style) @@ -90,8 +133,27 @@ static ostream& operator<<(ostream& out, WKBundleCSSStyleDeclarationRef style) return out; } +static ostream& operator<<(ostream& out, WKBundleFrameRef frame) +{ + WKRetainPtr<WKStringRef> name(AdoptWK, WKBundleFrameCopyName(frame)); + if (WKBundleFrameIsMainFrame(frame)) { + if (!WKStringIsEmpty(name.get())) + out << "main frame \"" << name << "\""; + else + out << "main frame"; + } else { + if (!WKStringIsEmpty(name.get())) + out << "frame \"" << name << "\""; + else + out << "frame (anonymous)"; + } + + return out; +} + InjectedBundlePage::InjectedBundlePage(WKBundlePageRef page) : m_page(page) + , m_world(AdoptWK, WKBundleScriptWorldCreateWorld()) , m_isLoading(false) { WKBundlePageLoaderClient loaderClient = { @@ -105,6 +167,8 @@ InjectedBundlePage::InjectedBundlePage(WKBundlePageRef page) didFinishLoadForFrame, didFailLoadWithErrorForFrame, didReceiveTitleForFrame, + 0, + 0, didClearWindowForFrame, didCancelClientRedirectForFrame, willPerformClientRedirectForFrame, @@ -158,43 +222,48 @@ void InjectedBundlePage::reset() { WKBundlePageClearMainFrameName(m_page); - WKBundlePageSetZoomFactor(m_page, 1.0f); - WKBundlePageSetZoomMode(m_page, kWKBundlePageZoomModePage); + WKBundlePageSetPageZoomFactor(m_page, 1); + WKBundlePageSetTextZoomFactor(m_page, 1); } // Loader Client Callbacks -void InjectedBundlePage::didStartProvisionalLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo) +void InjectedBundlePage::didStartProvisionalLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) { static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didStartProvisionalLoadForFrame(frame); } -void InjectedBundlePage::didReceiveServerRedirectForProvisionalLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo) +void InjectedBundlePage::didReceiveServerRedirectForProvisionalLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) { static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didReceiveServerRedirectForProvisionalLoadForFrame(frame); } -void InjectedBundlePage::didFailProvisionalLoadWithErrorForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo) +void InjectedBundlePage::didFailProvisionalLoadWithErrorForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) { static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFailProvisionalLoadWithErrorForFrame(frame); } -void InjectedBundlePage::didCommitLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo) +void InjectedBundlePage::didCommitLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) { static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didCommitLoadForFrame(frame); } -void InjectedBundlePage::didFinishLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo) +void InjectedBundlePage::didFinishLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) { static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFinishLoadForFrame(frame); } -void InjectedBundlePage::didFailLoadWithErrorForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo) +void InjectedBundlePage::didFinishDocumentLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void* clientInfo) +{ + static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFinishDocumentLoadForFrame(frame); +} + +void InjectedBundlePage::didFailLoadWithErrorForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) { static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFailLoadWithErrorForFrame(frame); } -void InjectedBundlePage::didReceiveTitleForFrame(WKBundlePageRef page, WKStringRef title, WKBundleFrameRef frame, const void *clientInfo) +void InjectedBundlePage::didReceiveTitleForFrame(WKBundlePageRef page, WKStringRef title, WKBundleFrameRef frame, WKTypeRef*, const void *clientInfo) { static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didReceiveTitleForFrame(title, frame); } @@ -219,11 +288,6 @@ void InjectedBundlePage::didChangeLocationWithinPageForFrame(WKBundlePageRef pag static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didChangeLocationWithinPageForFrame(frame); } -void InjectedBundlePage::didFinishDocumentLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void* clientInfo) -{ - static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didFinishDocumentLoadForFrame(frame); -} - void InjectedBundlePage::didHandleOnloadEventsForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void* clientInfo) { static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didHandleOnloadEventsForFrame(frame); @@ -261,25 +325,6 @@ void InjectedBundlePage::didCommitLoadForFrame(WKBundleFrameRef frame) { } -static JSValueRef propertyValue(JSContextRef context, JSObjectRef object, const char* propertyName) -{ - if (!object) - return 0; - JSRetainPtr<JSStringRef> propertyNameString(Adopt, JSStringCreateWithUTF8CString(propertyName)); - JSValueRef exception; - return JSObjectGetProperty(context, object, propertyNameString.get(), &exception); -} - -static double numericWindowPropertyValue(WKBundleFrameRef frame, const char* propertyName) -{ - JSGlobalContextRef context = WKBundleFrameGetJavaScriptContext(frame); - JSValueRef value = propertyValue(context, JSContextGetGlobalObject(context), propertyName); - if (!value) - return 0; - JSValueRef exception; - return JSValueToNumber(context, value, &exception); -} - enum FrameNamePolicy { ShouldNotIncludeFrameName, ShouldIncludeFrameName }; static void dumpFrameScrollPosition(WKBundleFrameRef frame, FrameNamePolicy shouldIncludeFrameName = ShouldNotIncludeFrameName) @@ -343,7 +388,7 @@ void InjectedBundlePage::dump() { ASSERT(InjectedBundle::shared().isTestRunning()); - InjectedBundle::shared().layoutTestController()->invalidateWaitToDumpWatchdog(); + InjectedBundle::shared().layoutTestController()->invalidateWaitToDumpWatchdogTimer(); switch (InjectedBundle::shared().layoutTestController()->whatToDump()) { case LayoutTestController::RenderTree: { @@ -534,37 +579,37 @@ void InjectedBundlePage::willRunJavaScriptPrompt(WKStringRef message, WKStringRe // Editor Client Callbacks -bool InjectedBundlePage::shouldBeginEditing(WKBundlePageRef page, WKBundleRangeRef range, const void* clientInfo) +bool InjectedBundlePage::shouldBeginEditing(WKBundlePageRef page, WKBundleRangeHandleRef range, const void* clientInfo) { return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldBeginEditing(range); } -bool InjectedBundlePage::shouldEndEditing(WKBundlePageRef page, WKBundleRangeRef range, const void* clientInfo) +bool InjectedBundlePage::shouldEndEditing(WKBundlePageRef page, WKBundleRangeHandleRef range, const void* clientInfo) { return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldEndEditing(range); } -bool InjectedBundlePage::shouldInsertNode(WKBundlePageRef page, WKBundleNodeRef node, WKBundleRangeRef rangeToReplace, WKInsertActionType action, const void* clientInfo) +bool InjectedBundlePage::shouldInsertNode(WKBundlePageRef page, WKBundleNodeHandleRef node, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType action, const void* clientInfo) { return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldInsertNode(node, rangeToReplace, action); } -bool InjectedBundlePage::shouldInsertText(WKBundlePageRef page, WKStringRef text, WKBundleRangeRef rangeToReplace, WKInsertActionType action, const void* clientInfo) +bool InjectedBundlePage::shouldInsertText(WKBundlePageRef page, WKStringRef text, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType action, const void* clientInfo) { return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldInsertText(text, rangeToReplace, action); } -bool InjectedBundlePage::shouldDeleteRange(WKBundlePageRef page, WKBundleRangeRef range, const void* clientInfo) +bool InjectedBundlePage::shouldDeleteRange(WKBundlePageRef page, WKBundleRangeHandleRef range, const void* clientInfo) { return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldDeleteRange(range); } -bool InjectedBundlePage::shouldChangeSelectedRange(WKBundlePageRef page, WKBundleRangeRef fromRange, WKBundleRangeRef toRange, WKAffinityType affinity, bool stillSelecting, const void* clientInfo) +bool InjectedBundlePage::shouldChangeSelectedRange(WKBundlePageRef page, WKBundleRangeHandleRef fromRange, WKBundleRangeHandleRef toRange, WKAffinityType affinity, bool stillSelecting, const void* clientInfo) { return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldChangeSelectedRange(fromRange, toRange, affinity, stillSelecting); } -bool InjectedBundlePage::shouldApplyStyle(WKBundlePageRef page, WKBundleCSSStyleDeclarationRef style, WKBundleRangeRef range, const void* clientInfo) +bool InjectedBundlePage::shouldApplyStyle(WKBundlePageRef page, WKBundleCSSStyleDeclarationRef style, WKBundleRangeHandleRef range, const void* clientInfo) { return static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->shouldApplyStyle(style, range); } @@ -589,27 +634,27 @@ void InjectedBundlePage::didChangeSelection(WKBundlePageRef page, WKStringRef no static_cast<InjectedBundlePage*>(const_cast<void*>(clientInfo))->didChangeSelection(notificationName); } -bool InjectedBundlePage::shouldBeginEditing(WKBundleRangeRef range) +bool InjectedBundlePage::shouldBeginEditing(WKBundleRangeHandleRef range) { if (!InjectedBundle::shared().isTestRunning()) return true; if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) - InjectedBundle::shared().os() << "EDITING DELEGATE: shouldBeginEditingInDOMRange:" << range << "\n"; + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldBeginEditingInDOMRange:" << toStr(m_page, m_world.get(), range) << "\n"; return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); } -bool InjectedBundlePage::shouldEndEditing(WKBundleRangeRef range) +bool InjectedBundlePage::shouldEndEditing(WKBundleRangeHandleRef range) { if (!InjectedBundle::shared().isTestRunning()) return true; if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) - InjectedBundle::shared().os() << "EDITING DELEGATE: shouldEndEditingInDOMRange:" << range << "\n"; + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldEndEditingInDOMRange:" << toStr(m_page, m_world.get(), range) << "\n"; return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); } -bool InjectedBundlePage::shouldInsertNode(WKBundleNodeRef node, WKBundleRangeRef rangeToReplace, WKInsertActionType action) +bool InjectedBundlePage::shouldInsertNode(WKBundleNodeHandleRef node, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType action) { if (!InjectedBundle::shared().isTestRunning()) return true; @@ -621,11 +666,11 @@ bool InjectedBundlePage::shouldInsertNode(WKBundleNodeRef node, WKBundleRangeRef }; if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) - InjectedBundle::shared().os() << "EDITING DELEGATE: shouldInsertNode:" << dumpPath(node) << " replacingDOMRange:" << rangeToReplace << " givenAction:" << insertactionstring[action] << "\n"; + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldInsertNode:" << dumpPath(m_page, m_world.get(), node) << " replacingDOMRange:" << toStr(m_page, m_world.get(), rangeToReplace) << " givenAction:" << insertactionstring[action] << "\n"; return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); } -bool InjectedBundlePage::shouldInsertText(WKStringRef text, WKBundleRangeRef rangeToReplace, WKInsertActionType action) +bool InjectedBundlePage::shouldInsertText(WKStringRef text, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType action) { if (!InjectedBundle::shared().isTestRunning()) return true; @@ -637,21 +682,21 @@ bool InjectedBundlePage::shouldInsertText(WKStringRef text, WKBundleRangeRef ran }; if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) - InjectedBundle::shared().os() << "EDITING DELEGATE: shouldInsertText:" << text << " replacingDOMRange:" << rangeToReplace << " givenAction:" << insertactionstring[action] << "\n"; + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldInsertText:" << text << " replacingDOMRange:" << toStr(m_page, m_world.get(), rangeToReplace) << " givenAction:" << insertactionstring[action] << "\n"; return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); } -bool InjectedBundlePage::shouldDeleteRange(WKBundleRangeRef range) +bool InjectedBundlePage::shouldDeleteRange(WKBundleRangeHandleRef range) { if (!InjectedBundle::shared().isTestRunning()) return true; if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) - InjectedBundle::shared().os() << "EDITING DELEGATE: shouldDeleteDOMRange:" << range << "\n"; + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldDeleteDOMRange:" << toStr(m_page, m_world.get(), range) << "\n"; return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); } -bool InjectedBundlePage::shouldChangeSelectedRange(WKBundleRangeRef fromRange, WKBundleRangeRef toRange, WKAffinityType affinity, bool stillSelecting) +bool InjectedBundlePage::shouldChangeSelectedRange(WKBundleRangeHandleRef fromRange, WKBundleRangeHandleRef toRange, WKAffinityType affinity, bool stillSelecting) { if (!InjectedBundle::shared().isTestRunning()) return true; @@ -666,17 +711,17 @@ bool InjectedBundlePage::shouldChangeSelectedRange(WKBundleRangeRef fromRange, W }; if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) - InjectedBundle::shared().os() << "EDITING DELEGATE: shouldChangeSelectedDOMRange:" << fromRange << " toDOMRange:" << toRange << " affinity:" << affinitystring[affinity] << " stillSelecting:" << boolstring[stillSelecting] << "\n"; + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldChangeSelectedDOMRange:" << toStr(m_page, m_world.get(), fromRange) << " toDOMRange:" << toStr(m_page, m_world.get(), toRange) << " affinity:" << affinitystring[affinity] << " stillSelecting:" << boolstring[stillSelecting] << "\n"; return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); } -bool InjectedBundlePage::shouldApplyStyle(WKBundleCSSStyleDeclarationRef style, WKBundleRangeRef range) +bool InjectedBundlePage::shouldApplyStyle(WKBundleCSSStyleDeclarationRef style, WKBundleRangeHandleRef range) { if (!InjectedBundle::shared().isTestRunning()) return true; if (InjectedBundle::shared().layoutTestController()->shouldDumpEditingCallbacks()) - InjectedBundle::shared().os() << "EDITING DELEGATE: shouldApplyStyle:" << style << " toElementsInDOMRange:" << range << "\n"; + InjectedBundle::shared().os() << "EDITING DELEGATE: shouldApplyStyle:" << style << " toElementsInDOMRange:" << toStr(m_page, m_world.get(), range) << "\n"; return InjectedBundle::shared().layoutTestController()->shouldAllowEditing(); } diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h b/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h index cde1655..c814c85 100644 --- a/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h +++ b/WebKitTools/WebKitTestRunner/InjectedBundle/InjectedBundlePage.h @@ -27,6 +27,8 @@ #define InjectedBundlePage_h #include <WebKit2/WKBundlePage.h> +#include <WebKit2/WKBundleScriptWorld.h> +#include <WebKit2/WKRetainPtr.h> namespace WTR { @@ -45,18 +47,18 @@ public: private: // Loader Client - static void didStartProvisionalLoadForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); - static void didReceiveServerRedirectForProvisionalLoadForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); - static void didFailProvisionalLoadWithErrorForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); - static void didCommitLoadForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); - static void didFinishLoadForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); - static void didFailLoadWithErrorForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); - static void didReceiveTitleForFrame(WKBundlePageRef, WKStringRef title, WKBundleFrameRef, const void*); + static void didStartProvisionalLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didReceiveServerRedirectForProvisionalLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didFailProvisionalLoadWithErrorForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didCommitLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didFinishLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didFinishDocumentLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didFailLoadWithErrorForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void*); + static void didReceiveTitleForFrame(WKBundlePageRef, WKStringRef title, WKBundleFrameRef, WKTypeRef*, const void*); static void didClearWindowForFrame(WKBundlePageRef, WKBundleFrameRef, WKBundleScriptWorldRef, const void*); static void didCancelClientRedirectForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); static void willPerformClientRedirectForFrame(WKBundlePageRef, WKBundleFrameRef, WKURLRef url, double delay, double date, const void*); static void didChangeLocationWithinPageForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); - static void didFinishDocumentLoadForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); static void didHandleOnloadEventsForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); static void didDisplayInsecureContentForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); static void didRunInsecureContentForFrame(WKBundlePageRef, WKBundleFrameRef, const void*); @@ -89,24 +91,24 @@ private: void willRunJavaScriptPrompt(WKStringRef message, WKStringRef defaultValue, WKBundleFrameRef); // Editor client - static bool shouldBeginEditing(WKBundlePageRef, WKBundleRangeRef, const void* clientInfo); - static bool shouldEndEditing(WKBundlePageRef, WKBundleRangeRef, const void* clientInfo); - static bool shouldInsertNode(WKBundlePageRef, WKBundleNodeRef, WKBundleRangeRef rangeToReplace, WKInsertActionType, const void* clientInfo); - static bool shouldInsertText(WKBundlePageRef, WKStringRef, WKBundleRangeRef rangeToReplace, WKInsertActionType, const void* clientInfo); - static bool shouldDeleteRange(WKBundlePageRef, WKBundleRangeRef, const void* clientInfo); - static bool shouldChangeSelectedRange(WKBundlePageRef, WKBundleRangeRef fromRange, WKBundleRangeRef toRange, WKAffinityType, bool stillSelecting, const void* clientInfo); - static bool shouldApplyStyle(WKBundlePageRef, WKBundleCSSStyleDeclarationRef style, WKBundleRangeRef range, const void* clientInfo); + static bool shouldBeginEditing(WKBundlePageRef, WKBundleRangeHandleRef, const void* clientInfo); + static bool shouldEndEditing(WKBundlePageRef, WKBundleRangeHandleRef, const void* clientInfo); + static bool shouldInsertNode(WKBundlePageRef, WKBundleNodeHandleRef, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType, const void* clientInfo); + static bool shouldInsertText(WKBundlePageRef, WKStringRef, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType, const void* clientInfo); + static bool shouldDeleteRange(WKBundlePageRef, WKBundleRangeHandleRef, const void* clientInfo); + static bool shouldChangeSelectedRange(WKBundlePageRef, WKBundleRangeHandleRef fromRange, WKBundleRangeHandleRef toRange, WKAffinityType, bool stillSelecting, const void* clientInfo); + static bool shouldApplyStyle(WKBundlePageRef, WKBundleCSSStyleDeclarationRef style, WKBundleRangeHandleRef range, const void* clientInfo); static void didBeginEditing(WKBundlePageRef, WKStringRef notificationName, const void* clientInfo); static void didEndEditing(WKBundlePageRef, WKStringRef notificationName, const void* clientInfo); static void didChange(WKBundlePageRef, WKStringRef notificationName, const void* clientInfo); static void didChangeSelection(WKBundlePageRef, WKStringRef notificationName, const void* clientInfo); - bool shouldBeginEditing(WKBundleRangeRef); - bool shouldEndEditing(WKBundleRangeRef); - bool shouldInsertNode(WKBundleNodeRef, WKBundleRangeRef rangeToReplace, WKInsertActionType); - bool shouldInsertText(WKStringRef, WKBundleRangeRef rangeToReplace, WKInsertActionType); - bool shouldDeleteRange(WKBundleRangeRef); - bool shouldChangeSelectedRange(WKBundleRangeRef fromRange, WKBundleRangeRef toRange, WKAffinityType, bool stillSelecting); - bool shouldApplyStyle(WKBundleCSSStyleDeclarationRef style, WKBundleRangeRef range); + bool shouldBeginEditing(WKBundleRangeHandleRef); + bool shouldEndEditing(WKBundleRangeHandleRef); + bool shouldInsertNode(WKBundleNodeHandleRef, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType); + bool shouldInsertText(WKStringRef, WKBundleRangeHandleRef rangeToReplace, WKInsertActionType); + bool shouldDeleteRange(WKBundleRangeHandleRef); + bool shouldChangeSelectedRange(WKBundleRangeHandleRef fromRange, WKBundleRangeHandleRef toRange, WKAffinityType, bool stillSelecting); + bool shouldApplyStyle(WKBundleCSSStyleDeclarationRef style, WKBundleRangeHandleRef range); void didBeginEditing(WKStringRef notificationName); void didEndEditing(WKStringRef notificationName); void didChange(WKStringRef notificationName); @@ -116,6 +118,7 @@ private: void dumpAllFrameScrollPositions(); WKBundlePageRef m_page; + WKRetainPtr<WKBundleScriptWorldRef> m_world; bool m_isLoading; }; diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp b/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp index d54bb1d..f8cbd4f 100644 --- a/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp +++ b/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.cpp @@ -41,7 +41,7 @@ namespace WTR { // This is lower than DumpRenderTree's timeout, to make it easier to work through the failures // Eventually it should be changed to match. -static const CFTimeInterval waitToDumpWatchdogInterval = 6.0; +const double LayoutTestController::waitToDumpWatchdogTimerInterval = 6; static JSValueRef propertyValue(JSContextRef context, JSObjectRef object, const char* propertyName) { @@ -94,6 +94,7 @@ LayoutTestController::LayoutTestController() , m_testRepaint(false) , m_testRepaintSweepHorizontally(false) { + platformInitialize(); } LayoutTestController::~LayoutTestController() @@ -110,32 +111,15 @@ void LayoutTestController::display() // FIXME: actually implement, once we want pixel tests } -void LayoutTestController::invalidateWaitToDumpWatchdog() -{ - if (m_waitToDumpWatchdog) { - CFRunLoopTimerInvalidate(m_waitToDumpWatchdog.get()); - m_waitToDumpWatchdog = 0; - } -} - -static void waitUntilDoneWatchdogFired(CFRunLoopTimerRef timer, void* info) -{ - InjectedBundle::shared().layoutTestController()->waitToDumpWatchdogTimerFired(); -} - void LayoutTestController::waitUntilDone() { m_waitToDump = true; - if (!m_waitToDumpWatchdog) { - m_waitToDumpWatchdog.adoptCF(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + waitToDumpWatchdogInterval, - 0, 0, 0, waitUntilDoneWatchdogFired, NULL)); - CFRunLoopAddTimer(CFRunLoopGetCurrent(), m_waitToDumpWatchdog.get(), kCFRunLoopCommonModes); - } + initializeWaitToDumpWatchdogTimerIfNeeded(); } void LayoutTestController::waitToDumpWatchdogTimerFired() { - invalidateWaitToDumpWatchdog(); + invalidateWaitToDumpWatchdogTimer(); const char* message = "FAIL: Timed out waiting for notifyDone to be called\n"; InjectedBundle::shared().os() << message << "\n"; InjectedBundle::shared().done(); diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.h b/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.h index 2c112a7..6ae20d8 100644 --- a/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.h +++ b/WebKitTools/WebKitTestRunner/InjectedBundle/LayoutTestController.h @@ -97,15 +97,20 @@ public: bool waitToDump() const { return m_waitToDump; } void waitToDumpWatchdogTimerFired(); - void invalidateWaitToDumpWatchdog(); + void invalidateWaitToDumpWatchdogTimer(); bool shouldAllowEditing() const { return m_shouldAllowEditing; } bool shouldCloseExtraWindowsAfterRunningTest() const { return m_shouldCloseExtraWindows; } private: + static const double waitToDumpWatchdogTimerInterval; + LayoutTestController(); + void platformInitialize(); + void initializeWaitToDumpWatchdogTimerIfNeeded(); + WhatToDump m_whatToDump; bool m_shouldDumpAllFrameScrollPositions; @@ -119,7 +124,11 @@ private: bool m_testRepaint; bool m_testRepaintSweepHorizontally; - RetainPtr<CFRunLoopTimerRef> m_waitToDumpWatchdog; +#if PLATFORM(MAC) + RetainPtr<CFRunLoopTimerRef> m_waitToDumpWatchdogTimer; +#elif PLATFORM(WIN) + UINT_PTR m_waitToDumpWatchdogTimer; +#endif }; } // namespace WTR diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/mac/LayoutTestControllerMac.mm b/WebKitTools/WebKitTestRunner/InjectedBundle/mac/LayoutTestControllerMac.mm new file mode 100644 index 0000000..2eb4d5b --- /dev/null +++ b/WebKitTools/WebKitTestRunner/InjectedBundle/mac/LayoutTestControllerMac.mm @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2010 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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. + */ + +#include "LayoutTestController.h" + +#include "InjectedBundle.h" + +namespace WTR { + +void LayoutTestController::platformInitialize() +{ +} + +void LayoutTestController::invalidateWaitToDumpWatchdogTimer() +{ + if (!m_waitToDumpWatchdogTimer) + return; + + CFRunLoopTimerInvalidate(m_waitToDumpWatchdogTimer.get()); + m_waitToDumpWatchdogTimer = 0; +} + +static void waitUntilDoneWatchdogTimerFired(CFRunLoopTimerRef timer, void* info) +{ + InjectedBundle::shared().layoutTestController()->waitToDumpWatchdogTimerFired(); +} + +void LayoutTestController::initializeWaitToDumpWatchdogTimerIfNeeded() +{ + if (m_waitToDumpWatchdogTimer) + return; + + m_waitToDumpWatchdogTimer.adoptCF(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + waitToDumpWatchdogTimerInterval, 0, 0, 0, WTR::waitUntilDoneWatchdogTimerFired, NULL)); + CFRunLoopAddTimer(CFRunLoopGetCurrent(), m_waitToDumpWatchdogTimer.get(), kCFRunLoopCommonModes); +} + +} // namespace WTR diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/win/LayoutTestControllerWin.cpp b/WebKitTools/WebKitTestRunner/InjectedBundle/win/LayoutTestControllerWin.cpp new file mode 100644 index 0000000..39cd727 --- /dev/null +++ b/WebKitTools/WebKitTestRunner/InjectedBundle/win/LayoutTestControllerWin.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2010 Apple 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: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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. + */ + +#include "LayoutTestController.h" + +#include "InjectedBundle.h" + +namespace WTR { + +void LayoutTestController::platformInitialize() +{ + m_waitToDumpWatchdogTimer = 0; +} + +void LayoutTestController::invalidateWaitToDumpWatchdogTimer() +{ + if (!m_waitToDumpWatchdogTimer) + return; + + ::KillTimer(0, m_waitToDumpWatchdogTimer); + m_waitToDumpWatchdogTimer = 0; +} + +static void CALLBACK waitToDumpWatchdogTimerFired(HWND, UINT, UINT_PTR, DWORD) +{ + InjectedBundle::shared().layoutTestController()->waitToDumpWatchdogTimerFired(); +} + +static const UINT_PTR waitToDumpWatchdogTimerIdentifier = 1; + +void LayoutTestController::initializeWaitToDumpWatchdogTimerIfNeeded() +{ + if (m_waitToDumpWatchdogTimer) + return; + + m_waitToDumpWatchdogTimer = ::SetTimer(0, waitToDumpWatchdogTimerIdentifier, waitToDumpWatchdogTimerInterval * 1000, WTR::waitToDumpWatchdogTimerFired); +} + +} // namespace WTR diff --git a/WebKitTools/WebKitTestRunner/TestController.cpp b/WebKitTools/WebKitTestRunner/TestController.cpp index 6f97b9f..a71b07d 100644 --- a/WebKitTools/WebKitTestRunner/TestController.cpp +++ b/WebKitTools/WebKitTestRunner/TestController.cpp @@ -83,6 +83,7 @@ static WKPageRef createOtherPage(WKPageRef oldPage, const void*) 0, 0, 0, + 0, 0 }; WKPageSetPageUIClient(newPage, &otherPageUIClient); @@ -142,7 +143,8 @@ void TestController::initialize(int argc, const char* argv[]) WKContextInjectedBundleClient injectedBundleClient = { 0, this, - didReceiveMessageFromInjectedBundle + didReceiveMessageFromInjectedBundle, + 0 }; WKContextSetInjectedBundleClient(m_context.get(), &injectedBundleClient); @@ -160,6 +162,7 @@ void TestController::initialize(int argc, const char* argv[]) 0, 0, 0, + 0, 0 }; WKPageSetPageUIClient(m_mainWebView->page(), &pageUIClient); @@ -247,7 +250,7 @@ void TestController::run() // WKContextInjectedBundleClient -void TestController::didReceiveMessageFromInjectedBundle(WKContextRef context, WKStringRef messageName, WKTypeRef messageBody, const void *clientInfo) +void TestController::didReceiveMessageFromInjectedBundle(WKContextRef context, WKStringRef messageName, WKTypeRef messageBody, const void* clientInfo) { static_cast<TestController*>(const_cast<void*>(clientInfo))->didReceiveMessageFromInjectedBundle(messageName, messageBody); } @@ -259,7 +262,7 @@ void TestController::didReceiveMessageFromInjectedBundle(WKStringRef messageName // WKPageLoaderClient -void TestController::didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, const void* clientInfo) +void TestController::didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef, const void* clientInfo) { static_cast<TestController*>(const_cast<void*>(clientInfo))->didFinishLoadForFrame(page, frame); } diff --git a/WebKitTools/WebKitTestRunner/TestController.h b/WebKitTools/WebKitTestRunner/TestController.h index 5f6d99d..a9e6ab3 100644 --- a/WebKitTools/WebKitTestRunner/TestController.h +++ b/WebKitTools/WebKitTestRunner/TestController.h @@ -75,7 +75,7 @@ private: void didReceiveMessageFromInjectedBundle(WKStringRef messageName, WKTypeRef messageBody); // WKPageLoaderClient - static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, const void*); + static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef userData, const void*); void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame); diff --git a/WebKitTools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj b/WebKitTools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj index f5ee6d5..6ecbef9 100644 --- a/WebKitTools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj +++ b/WebKitTools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj @@ -54,6 +54,7 @@ BCC9981811D3F51E0017BCA2 /* LayoutTestController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCC9981711D3F51E0017BCA2 /* LayoutTestController.cpp */; }; BCD7D2F811921278006DB7EE /* TestInvocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BCD7D2F711921278006DB7EE /* TestInvocation.cpp */; }; BCDA2B9A1191051F00C3BC47 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCDA2B991191051F00C3BC47 /* JavaScriptCore.framework */; }; + C0CE720B1247C93300BC0EC4 /* LayoutTestControllerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = C0CE720A1247C93300BC0EC4 /* LayoutTestControllerMac.mm */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -132,6 +133,7 @@ BCD7D2F611921278006DB7EE /* TestInvocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestInvocation.h; sourceTree = "<group>"; }; BCD7D2F711921278006DB7EE /* TestInvocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TestInvocation.cpp; sourceTree = "<group>"; }; BCDA2B991191051F00C3BC47 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = JavaScriptCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C0CE720A1247C93300BC0EC4 /* LayoutTestControllerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = LayoutTestControllerMac.mm; path = mac/LayoutTestControllerMac.mm; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -223,6 +225,7 @@ BC14E4D8120E02D000826C0C /* GCController.h */, BCC9981711D3F51E0017BCA2 /* LayoutTestController.cpp */, BCC9981611D3F51E0017BCA2 /* LayoutTestController.h */, + C0CE720A1247C93300BC0EC4 /* LayoutTestControllerMac.mm */, ); name = Controllers; sourceTree = "<group>"; @@ -443,6 +446,7 @@ BC14E4EA120E03D800826C0C /* JSGCController.cpp in Sources */, BC8FD8CA120E527F00F3E71A /* EventSendingController.cpp in Sources */, BC8FD8D2120E545B00F3E71A /* JSEventSendingController.cpp in Sources */, + C0CE720B1247C93300BC0EC4 /* LayoutTestControllerMac.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/WebKitTools/WebKitTestRunner/win/InjectedBundle.vcproj b/WebKitTools/WebKitTestRunner/win/InjectedBundle.vcproj index 71dcf95..22c9a89 100644 --- a/WebKitTools/WebKitTestRunner/win/InjectedBundle.vcproj +++ b/WebKitTools/WebKitTestRunner/win/InjectedBundle.vcproj @@ -317,39 +317,39 @@ >
</File>
<File
- RelativePath="..\InjectedBundle\InjectedBundle.cpp"
+ RelativePath="..\InjectedBundle\EventSendingController.cpp"
>
</File>
<File
- RelativePath="..\InjectedBundle\InjectedBundle.h"
+ RelativePath="..\InjectedBundle\EventSendingController.h"
>
</File>
<File
- RelativePath="..\InjectedBundle\InjectedBundleMain.cpp"
+ RelativePath="..\InjectedBundle\GCController.cpp"
>
</File>
<File
- RelativePath="..\InjectedBundle\InjectedBundlePage.cpp"
+ RelativePath="..\InjectedBundle\GCController.h"
>
</File>
<File
- RelativePath="..\InjectedBundle\InjectedBundlePage.h"
+ RelativePath="..\InjectedBundle\InjectedBundle.cpp"
>
</File>
<File
- RelativePath="..\InjectedBundle\EventSendingController.cpp"
+ RelativePath="..\InjectedBundle\InjectedBundle.h"
>
</File>
<File
- RelativePath="..\InjectedBundle\EventSendingController.h"
+ RelativePath="..\InjectedBundle\InjectedBundleMain.cpp"
>
</File>
<File
- RelativePath="..\InjectedBundle\GCController.cpp"
+ RelativePath="..\InjectedBundle\InjectedBundlePage.cpp"
>
</File>
<File
- RelativePath="..\InjectedBundle\GCController.h"
+ RelativePath="..\InjectedBundle\InjectedBundlePage.h"
>
</File>
<File
@@ -360,6 +360,10 @@ RelativePath="..\InjectedBundle\LayoutTestController.h"
>
</File>
+ <File
+ RelativePath="..\InjectedBundle\win\LayoutTestControllerWin.cpp"
+ >
+ </File>
</Files>
<Globals>
</Globals>
diff --git a/WebKitTools/wx/build/settings.py b/WebKitTools/wx/build/settings.py index 7dfaa5f..cd3358c 100644 --- a/WebKitTools/wx/build/settings.py +++ b/WebKitTools/wx/build/settings.py @@ -102,6 +102,7 @@ webcore_dirs = [ 'WebCore/bindings/cpp', 'WebCore/bindings/generic', 'WebCore/bindings/js', + 'WebCore/bindings/js/specialization', 'WebCore/bridge', 'WebCore/bridge/c', 'WebCore/bridge/jsc', @@ -141,12 +142,14 @@ webcore_dirs = [ 'WebCore/platform/text/transcoder', 'WebCore/plugins', 'WebCore/rendering', - 'WebCore/rendering/style', + 'WebCore/rendering/style', + 'WebCore/rendering/svg', 'WebCore/storage', 'WebCore/svg', 'WebCore/svg/animation', 'WebCore/svg/graphics', 'WebCore/svg/graphics/filters', + 'WebCore/websockets', 'WebCore/xml' ] |