15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension_process_policy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_isolation_info.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/constants.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const extensions::Extension* GetNonBookmarkAppExtension(
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const ExtensionSet& extensions, const GURL& url) {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exclude bookmark apps, which do not use the app process model.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension =
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions.GetExtensionOrAppByURL(url);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extension && extension->from_bookmark())
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = NULL;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return extension;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CrossesExtensionProcessBoundary(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ExtensionSet& extensions,
27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const GURL& old_url,
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const GURL& new_url,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool should_consider_workaround) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* old_url_extension = GetNonBookmarkAppExtension(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_url);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* new_url_extension = GetNonBookmarkAppExtension(
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_url);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(creis): Temporary workaround for crbug.com/59285: Do not swap process
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to navigate from a hosted app to a normal page or another hosted app
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (unless either is the web store).  This is because some OAuth providers
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use non-app popups that communicate with non-app iframes inside the app
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (e.g., Facebook).  This would require out-of-process iframes to support.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See http://crbug.com/99379.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that we skip this exception for isolated apps, which require strict
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process separation from non-app pages.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (should_consider_workaround) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool old_url_is_hosted_app = old_url_extension &&
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !old_url_extension->web_extent().is_empty() &&
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        !AppIsolationInfo::HasIsolatedStorage(old_url_extension);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool new_url_is_normal_or_hosted = !new_url_extension ||
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (!new_url_extension->web_extent().is_empty() &&
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         !AppIsolationInfo::HasIsolatedStorage(new_url_extension));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool either_is_web_store =
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (old_url_extension &&
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        old_url_extension->id() == extensions::kWebStoreAppId) ||
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (new_url_extension &&
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new_url_extension->id() == extensions::kWebStoreAppId);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (old_url_is_hosted_app &&
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new_url_is_normal_or_hosted &&
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !either_is_web_store)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return old_url_extension != new_url_extension;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
67