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

Unified Diff: chrome/renderer/extensions/dispatcher.cc

Issue 23847004: "Redirecting URLs to Packaged Apps" implementation: revised (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed an editing error Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/extensions/dispatcher.cc
diff --git a/chrome/renderer/extensions/dispatcher.cc b/chrome/renderer/extensions/dispatcher.cc
index 7ed9437eb12539c5f71807233a45a6d0d2980ca6..5149446ac6935feef61b4666100a18d3cb457f69 100644
--- a/chrome/renderer/extensions/dispatcher.cc
+++ b/chrome/renderer/extensions/dispatcher.cc
@@ -19,6 +19,7 @@
#include "chrome/common/chrome_version_info.h"
#include "chrome/common/extensions/api/extension_api.h"
#include "chrome/common/extensions/api/runtime.h"
+#include "chrome/common/extensions/api/url_handlers/url_handlers_parser.h"
#include "chrome/common/extensions/background_info.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_constants.h"
@@ -94,6 +95,7 @@
#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
#include "third_party/WebKit/public/web/WebScopedUserGesture.h"
#include "third_party/WebKit/public/web/WebSecurityPolicy.h"
+#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
#include "third_party/WebKit/public/web/WebView.h"
#include "ui/base/layout.h"
#include "ui/base/resource/resource_bundle.h"
@@ -1568,4 +1570,74 @@ void Dispatcher::InvokeModuleSystemMethod(
}
}
+bool Dispatcher::MaybeRedirectUrlToApp(
benwells 2013/09/04 23:54:20 It doesn't feel good to have this code here. Did y
sergeygs 2013/09/05 09:19:03 Obsolete.
+ WebKit::WebFrame* frame,
+ const WebKit::WebURLRequest& request,
+ WebKit::WebNavigationType type,
+ WebKit::WebNavigationPolicy default_policy) {
+ // Limit redirection to top-level frames only.
+ if (frame != frame->top())
+ return false;
+
+ // Exclude Ignore and Download.
+ const bool policy_ok =
+ (default_policy == WebKit::WebNavigationPolicyCurrentTab) ||
+ (default_policy == WebKit::WebNavigationPolicyNewBackgroundTab) ||
+ (default_policy == WebKit::WebNavigationPolicyNewForegroundTab) ||
+ (default_policy == WebKit::WebNavigationPolicyNewWindow) ||
+ (default_policy == WebKit::WebNavigationPolicyNewPopup);
+ if (!policy_ok)
+ return false;
+
+ bool navigation_type_ok = false;
+ if (IsWithinPlatformApp()) {
not at google - send to devlin 2013/09/04 15:37:21 I didn't think you could navigate within platform
sergeygs 2013/09/05 09:19:03 To answer the question: this is ultimately called
+ // Exclude reloads (shouldn't happen anyway), back/forward, form submits,
+ // and regular links (without target='_blank'). The latter are not supposed
+ // to work in apps at all: an error message is normally printed to console
+ // if one is clicked, so fall back to that default behavior here.
+ navigation_type_ok =
+ (type == WebKit::WebNavigationTypeOther && frame->opener());
+ } else {
+ // Exclude reloads (shouldn't happen anyway), back/forward, form submits.
+ navigation_type_ok =
+ WebKit::WebUserGestureIndicator::isProcessingUserGesture() ||
+ (type == WebKit::WebNavigationTypeOther && frame->opener()) ||
+ (type == WebKit::WebNavigationTypeLinkClicked);
+ }
+ if (!navigation_type_ok)
+ return false;
+
+ const GURL url(request.url());
+ const GURL ref_url(request.httpHeaderField(WebString::fromUTF8("Referer")));
+
+ // Find out if there is an extension that can handle the URL.
+ bool some_extension_can_handle = false;
+ for (ExtensionSet::const_iterator it = extensions_.begin();
+ it != extensions_.end(); ++it) {
+ if (UrlHandlers::CanExtensionHandleUrl(*it, url)) {
+ some_extension_can_handle = true;
+ break;
+ }
+ }
+ if (!some_extension_can_handle)
+ return false;
+
+ // Get the correct RenderView (tab or app window) so that we can send a
+ // routed IPC to the correct listener.
+ content::RenderView* render_view = NULL;
+ if (IsWithinPlatformApp()) {
not at google - send to devlin 2013/09/04 15:37:21 likewise
sergeygs 2013/09/05 09:19:03 See the answer above.
+ render_view = content::RenderView::FromWebView(frame->opener()->view());
+ } else {
+ render_view = frame->opener() ?
+ content::RenderView::FromWebView(frame->opener()->view()) :
+ content::RenderView::FromWebView(frame->view());
not at google - send to devlin 2013/09/04 15:37:21 does this mean that you redirect the opener frame
sergeygs 2013/09/05 09:19:03 I used the opener frame's routing ID to reach the
+ }
+ if (!render_view)
+ return false;
+
+ return RenderThread::Get()->Send(
+ new ExtensionHostMsg_RedirectUrl(
+ render_view->GetRoutingID(), url, ref_url));
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698