Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Issue 1228863005: [MediaRouter] The minimal change to make everything build on Android. (Closed)

Created:
5 years, 5 months ago by whywhat
Modified:
5 years, 5 months ago
CC:
Aaron Boodman, abarth-chromium, ben+mojo_chromium.org, chromium-reviews, darin (slow to review), feature-media-reviews_chromium.org, haibinlu, Kevin M, mcasas+watch_chromium.org, media-router+watch_chromium.org, posciak+watch_chromium.org, qsr+mojo_chromium.org, viettrungluu+watch_chromium.org, wjia+watch_chromium.org, yzshen+watch_chromium.org
Base URL:
https://chromium.googlesource.com/chromium/src.git@master
Target Ref:
refs/pending/heads/master
Project:
chromium
Visibility:
Public.

Description

[MediaRouter] The minimal change to make everything build on Android. BUG=412331 NOTRY=true NOTREECHECKS=true Committed: https://crrev.com/6f828083bd41d61e23a6ebe89288a9b3126ae586 Cr-Commit-Position: refs/heads/master@{#339708}

Patch Set 1 #

Patch Set 2 : Fixed Mac build, some Eclipse formatting #

Patch Set 3 : Another couple of compile failures fixed #

Patch Set 4 : Adding the renamed unittest file #

Patch Set 5 : Renamings in the test #

Patch Set 6 : E2E test compile fix #

Patch Set 7 : Fixed dialog browsertest compile #

Patch Set 8 : Rebased #

Patch Set 9 : Typo in a chrome/test/BUILD.gn #

Total comments: 14

Patch Set 10 : Rebase #

Patch Set 11 : Addressed minor comments #

Patch Set 12 : Added a stub MediaRouterAndroid for tests #

Patch Set 13 : Fixed test_support compile issue on ChromeOS #

Total comments: 6

Patch Set 14 : Moved MRDC::GetOrCreateForWebContents to its own .cc file #

Total comments: 6

Patch Set 15 : Fixed nits by Jennifer. #

Patch Set 16 : Fixed a comment in the derived class declaration #

Patch Set 17 : Rebase #

Patch Set 18 : Rebase with chromium trunk #

Patch Set 19 : Fixed the include for MediaRouterDialogControllerImpl #

Total comments: 11
Unified diffs Side-by-side diffs Delta from patch set Stats (+493 lines, -1049 lines) Patch
M build/common.gypi View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2 chunks +1 line, -2 lines 0 comments Download
M build/config/features.gni View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 chunk +1 line, -1 line 0 comments Download
A chrome/browser/media/android/router/OWNERS View 1 2 3 4 5 6 7 8 9 10 11 12 13 1 chunk +3 lines, -0 lines 0 comments Download
A chrome/browser/media/android/router/media_router_android.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +61 lines, -0 lines 0 comments Download
A chrome/browser/media/android/router/media_router_android.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +74 lines, -0 lines 0 comments Download
A chrome/browser/media/android/router/media_router_dialog_controller_android.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +44 lines, -0 lines 0 comments Download
A chrome/browser/media/android/router/media_router_dialog_controller_android.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +44 lines, -0 lines 0 comments Download
M chrome/browser/media/router/BUILD.gn View 1 chunk +10 lines, -3 lines 0 comments Download
M chrome/browser/media/router/media_router.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 chunks +3 lines, -2 lines 0 comments Download
M chrome/browser/media/router/media_router.gyp View 1 chunk +16 lines, -5 lines 0 comments Download
M chrome/browser/media/router/media_router.gypi View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 chunks +11 lines, -6 lines 0 comments Download
A chrome/browser/media/router/media_router_dialog_controller.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +43 lines, -0 lines 0 comments Download
A chrome/browser/media/router/media_router_dialog_controller.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 1 chunk +27 lines, -0 lines 0 comments Download
A + chrome/browser/media/router/media_router_factory.h View 3 chunks +11 lines, -12 lines 0 comments Download
A + chrome/browser/media/router/media_router_factory.cc View 1 2 3 4 5 6 7 8 9 10 11 2 chunks +24 lines, -13 lines 0 comments Download
M chrome/browser/media/router/media_router_mojo_impl.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 3 chunks +2 lines, -4 lines 0 comments Download
M chrome/browser/media/router/media_router_mojo_impl.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 chunks +3 lines, -3 lines 0 comments Download
D chrome/browser/media/router/media_router_mojo_impl_factory.h View 1 chunk +0 lines, -43 lines 0 comments Download
D chrome/browser/media/router/media_router_mojo_impl_factory.cc View 1 chunk +0 lines, -56 lines 0 comments Download
M chrome/browser/media/router/presentation_service_delegate_impl.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 3 chunks +4 lines, -6 lines 0 comments Download
M chrome/browser/ui/BUILD.gn View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 chunk +1 line, -1 line 0 comments Download
M chrome/browser/ui/toolbar/media_router_action.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 chunks +3 lines, -2 lines 3 comments Download
M chrome/browser/ui/toolbar/media_router_action.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 chunks +5 lines, -4 lines 0 comments Download
M chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 chunks +2 lines, -2 lines 0 comments Download
D chrome/browser/ui/webui/media_router/media_router_dialog_controller.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +0 lines, -94 lines 0 comments Download
D chrome/browser/ui/webui/media_router/media_router_dialog_controller.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 chunk +0 lines, -358 lines 0 comments Download
M chrome/browser/ui/webui/media_router/media_router_dialog_controller_browsertest.cc View 1 2 3 4 5 6 7 8 9 10 11 1 chunk +0 lines, -118 lines 0 comments Download
A + chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 3 chunks +18 lines, -27 lines 2 comments Download
A + chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 12 chunks +25 lines, -24 lines 0 comments Download
A + chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl_browsertest.cc View 1 2 3 4 5 6 7 8 9 10 11 3 chunks +4 lines, -4 lines 0 comments Download
A + chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl_unittest.cc View 1 2 3 4 10 chunks +21 lines, -20 lines 0 comments Download
D chrome/browser/ui/webui/media_router/media_router_dialog_controller_unittest.cc View 1 2 1 chunk +0 lines, -224 lines 0 comments Download
M chrome/browser/ui/webui/media_router/media_router_ui.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 3 chunks +3 lines, -3 lines 2 comments Download
M chrome/chrome_browser.gypi View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 chunk +4 lines, -0 lines 2 comments Download
M chrome/chrome_browser_ui.gypi View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 2 chunks +3 lines, -3 lines 2 comments Download
M chrome/chrome_tests.gypi View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 chunk +1 line, -1 line 0 comments Download
M chrome/chrome_tests_unit.gypi View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2 chunks +10 lines, -3 lines 0 comments Download
M chrome/test/BUILD.gn View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 chunk +6 lines, -0 lines 0 comments Download
M chrome/test/media_router/media_router_e2e_browsertest.cc View 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 2 chunks +2 lines, -2 lines 0 comments Download
M chrome/test/media_router/media_router_integration_browsertest.cc View 1 2 3 4 5 6 7 8 9 2 chunks +3 lines, -3 lines 0 comments Download

Dependent Patchsets:

Messages

Total messages: 76 (26 generated)
commit-bot: I haz the power
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1228863005/1
5 years, 5 months ago (2015-07-09 21:14:53 UTC) #2
commit-bot: I haz the power
Dry run: Try jobs failed on following builders: mac_chromium_compile_dbg_ng on tryserver.chromium.mac (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.mac/builders/mac_chromium_compile_dbg_ng/builds/72189) mac_chromium_rel_ng on ...
5 years, 5 months ago (2015-07-09 21:27:48 UTC) #4
commit-bot: I haz the power
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1228863005/20001
5 years, 5 months ago (2015-07-09 21:49:38 UTC) #6
whywhat
I'm splitting my WIP patch you reviewed a few weeks ago into smaller chunks (incorporating ...
5 years, 5 months ago (2015-07-09 21:52:37 UTC) #8
commit-bot: I haz the power
Dry run: Try jobs failed on following builders: linux_chromium_compile_dbg_32_ng on tryserver.chromium.linux (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_compile_dbg_32_ng/builds/71718)
5 years, 5 months ago (2015-07-09 22:09:50 UTC) #10
commit-bot: I haz the power
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1228863005/120001
5 years, 5 months ago (2015-07-13 13:04:52 UTC) #12
commit-bot: I haz the power
Dry run: Try jobs failed on following builders: ios_rel_device_ninja on tryserver.chromium.mac (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.mac/builders/ios_rel_device_ninja/builds/86724) mac_chromium_compile_dbg_ng on ...
5 years, 5 months ago (2015-07-13 13:06:36 UTC) #14
whywhat
Rebased
5 years, 5 months ago (2015-07-13 17:48:53 UTC) #15
commit-bot: I haz the power
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1228863005/140001
5 years, 5 months ago (2015-07-13 17:49:49 UTC) #17
commit-bot: I haz the power
Dry run: Try jobs failed on following builders: linux_chromium_gn_chromeos_rel on tryserver.chromium.linux (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_gn_chromeos_rel/builds/57080) linux_chromium_gn_dbg on ...
5 years, 5 months ago (2015-07-13 17:54:59 UTC) #19
whywhat
Typo in a chrome/test/BUILD.gn
5 years, 5 months ago (2015-07-13 18:45:47 UTC) #20
imcheng
I wanted to see if we can extract a base abstract class for MediaRouterDialogController. That ...
5 years, 5 months ago (2015-07-13 22:04:15 UTC) #21
whywhat
Rebase
5 years, 5 months ago (2015-07-15 10:15:08 UTC) #22
whywhat
https://codereview.chromium.org/1228863005/diff/160001/chrome/browser/media/router/media_router_dialog_controller.h File chrome/browser/media/router/media_router_dialog_controller.h (right): https://codereview.chromium.org/1228863005/diff/160001/chrome/browser/media/router/media_router_dialog_controller.h#newcode24 chrome/browser/media/router/media_router_dialog_controller.h:24: ~MediaRouterDialogController() = default; On 2015/07/13 at 22:04:14, imcheng1 wrote: ...
5 years, 5 months ago (2015-07-15 12:41:05 UTC) #23
whywhat
Addressed minor comments
5 years, 5 months ago (2015-07-15 12:41:46 UTC) #24
whywhat
Added a stub MediaRouterAndroid for tests
5 years, 5 months ago (2015-07-15 15:25:48 UTC) #25
whywhat
Fixed test_support compile issue on ChromeOS
5 years, 5 months ago (2015-07-15 16:27:27 UTC) #26
imcheng
lgtm % a few comments https://codereview.chromium.org/1228863005/diff/160001/chrome/browser/media/router/media_router_dialog_controller.h File chrome/browser/media/router/media_router_dialog_controller.h (right): https://codereview.chromium.org/1228863005/diff/160001/chrome/browser/media/router/media_router_dialog_controller.h#newcode29 chrome/browser/media/router/media_router_dialog_controller.h:29: static MediaRouterDialogController* GetOrCreateForWebContents( On ...
5 years, 5 months ago (2015-07-16 18:28:20 UTC) #27
whywhat
Moved MRDC::GetOrCreateForWebContents to its own .cc file
5 years, 5 months ago (2015-07-16 19:57:01 UTC) #28
whywhat
+jam for owners approval Especially, build files in build/, chrome/test and chrome/browser/ui/ (everything media_router and ...
5 years, 5 months ago (2015-07-16 20:17:18 UTC) #30
jam
On 2015/07/16 20:17:18, whywhat wrote: > +jam for owners approval see comment in chrome/owners: # ...
5 years, 5 months ago (2015-07-16 22:36:13 UTC) #31
whywhat
On 2015/07/16 at 22:36:13, jam wrote: > On 2015/07/16 20:17:18, whywhat wrote: > > +jam ...
5 years, 5 months ago (2015-07-16 22:50:11 UTC) #32
whywhat
5 years, 5 months ago (2015-07-16 22:50:38 UTC) #34
xhwang
chrome/browser/media/android/ lgtm
5 years, 5 months ago (2015-07-17 23:51:04 UTC) #35
apacible
chrome/browser/ui/webui lgtm + couple of nits https://codereview.chromium.org/1228863005/diff/260001/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc File chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc (right): https://codereview.chromium.org/1228863005/diff/260001/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc#newcode104 chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc:104: // static nit: ...
5 years, 5 months ago (2015-07-20 14:10:32 UTC) #36
whywhat
jam: your turn :) https://codereview.chromium.org/1228863005/diff/260001/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc File chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc (right): https://codereview.chromium.org/1228863005/diff/260001/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc#newcode104 chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.cc:104: // static On 2015/07/20 at ...
5 years, 5 months ago (2015-07-20 14:27:48 UTC) #37
apacible
https://codereview.chromium.org/1228863005/diff/260001/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h File chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h (right): https://codereview.chromium.org/1228863005/diff/260001/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h#newcode26 chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h:26: // MediaRouterDialogController implementation. On 2015/07/20 14:27:47, whywhat wrote: > ...
5 years, 5 months ago (2015-07-20 14:46:40 UTC) #38
jam
On 2015/07/16 22:50:11, whywhat wrote: > On 2015/07/16 at 22:36:13, jam wrote: > > On ...
5 years, 5 months ago (2015-07-20 16:11:25 UTC) #39
whywhat
Thanks all for the reviews! https://codereview.chromium.org/1228863005/diff/260001/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h File chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h (right): https://codereview.chromium.org/1228863005/diff/260001/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h#newcode26 chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h:26: // MediaRouterDialogController implementation. On ...
5 years, 5 months ago (2015-07-20 16:52:59 UTC) #40
whywhat
Fixed a comment in the derived class declaration
5 years, 5 months ago (2015-07-20 16:53:07 UTC) #41
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1228863005/300001
5 years, 5 months ago (2015-07-20 16:53:47 UTC) #44
commit-bot: I haz the power
Try jobs failed on following builders: linux_chromium_compile_dbg_32_ng on tryserver.chromium.linux (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_compile_dbg_32_ng/builds/75210) ios_rel_device_ninja on tryserver.chromium.mac (JOB_FAILED, ...
5 years, 5 months ago (2015-07-20 16:56:02 UTC) #46
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1228863005/320001
5 years, 5 months ago (2015-07-20 20:43:12 UTC) #49
commit-bot: I haz the power
Try jobs failed on following builders: linux_chromium_compile_dbg_32_ng on tryserver.chromium.linux (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_compile_dbg_32_ng/builds/75353) ios_dbg_simulator_ninja on tryserver.chromium.mac (JOB_FAILED, ...
5 years, 5 months ago (2015-07-20 20:46:12 UTC) #51
whywhat
Rebase with chromium trunk
5 years, 5 months ago (2015-07-20 22:10:52 UTC) #52
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1228863005/340001
5 years, 5 months ago (2015-07-20 22:15:01 UTC) #55
commit-bot: I haz the power
Try jobs failed on following builders: linux_chromium_compile_dbg_32_ng on tryserver.chromium.linux (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_compile_dbg_32_ng/builds/75415)
5 years, 5 months ago (2015-07-20 22:28:49 UTC) #57
whywhat
Fixed the include for MediaRouterDialogControllerImpl
5 years, 5 months ago (2015-07-21 14:11:50 UTC) #58
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1228863005/360001
5 years, 5 months ago (2015-07-21 14:17:09 UTC) #61
commit-bot: I haz the power
Try jobs failed on following builders: linux_chromium_asan_rel_ng on tryserver.chromium.linux (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_asan_rel_ng/builds/30217)
5 years, 5 months ago (2015-07-21 14:53:28 UTC) #63
whywhat
On 2015/07/21 at 14:53:28, commit-bot wrote: > Try jobs failed on following builders: > linux_chromium_asan_rel_ng ...
5 years, 5 months ago (2015-07-21 15:07:26 UTC) #65
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1228863005/360001
5 years, 5 months ago (2015-07-21 15:07:46 UTC) #66
commit-bot: I haz the power
Try jobs failed on following builders: win_chromium_rel_ng on tryserver.chromium.win (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.win/builders/win_chromium_rel_ng/builds/82626)
5 years, 5 months ago (2015-07-21 17:05:03 UTC) #68
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/1228863005/360001
5 years, 5 months ago (2015-07-21 18:36:42 UTC) #70
commit-bot: I haz the power
Committed patchset #19 (id:360001)
5 years, 5 months ago (2015-07-21 18:44:15 UTC) #71
commit-bot: I haz the power
Patchset 19 (id:??) landed as https://crrev.com/6f828083bd41d61e23a6ebe89288a9b3126ae586 Cr-Commit-Position: refs/heads/master@{#339708}
5 years, 5 months ago (2015-07-21 18:45:54 UTC) #72
apacible
https://codereview.chromium.org/1228863005/diff/360001/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h File chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h (right): https://codereview.chromium.org/1228863005/diff/360001/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h#newcode26 chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl.h:26: // SuperClass: Oops, some miscommunication for this line -- ...
5 years, 5 months ago (2015-07-22 04:00:09 UTC) #73
mark a. foltz
I noticed a few things in the build files but nothing urgent. There are a ...
5 years, 5 months ago (2015-07-22 21:16:39 UTC) #74
whywhat
Thanks! I'll take a look at the build files again and will try to follow ...
5 years, 5 months ago (2015-07-22 22:55:01 UTC) #75
mark a. foltz
5 years, 5 months ago (2015-07-22 23:05:55 UTC) #76
Message was sent while issue was closed.
lgtm

https://codereview.chromium.org/1228863005/diff/360001/chrome/browser/ui/tool...
File chrome/browser/ui/toolbar/media_router_action.h (left):

https://codereview.chromium.org/1228863005/diff/360001/chrome/browser/ui/tool...
chrome/browser/ui/toolbar/media_router_action.h:49:
media_router::MediaRouterDialogController* GetMediaRouterDialogController();
On 2015/07/22 at 22:55:01, whywhat wrote:
> On 2015/07/22 at 21:16:39, mark a. foltz wrote:
> > Why does this API need to be changed to use the implementation type?
> 
> Well, I assumed that webui/ classes can use the webui specific Impl class.
That way webui/ specific methods can be added to the Impl class and accessed
from other webui/ classes. These methods (e.g. about dialog's WebContents) won't
even make sense on Android so I don't want to drag them out into the base class.
> 
> Also, this made the impact on the webui/ code minimal.
> 
> However, it seems to only use Show and Close MediaRouterDialog methods so I
could use the base class. I'll look into it in my follow-up change.

Okay, if the methods make sense in the MediaRouterDialog class then I would
prefer you move them up and revert this change.  Otherwise it's not a big deal.

In general I prefer APIs that return interface types instead of implementation
types, because exposing implementation types makes unit testing and future
refactoring harder.

Powered by Google App Engine
This is Rietveld 408576698